Я проверял эффективность моей простой разделяемой библиотеки C и сравнивал ее с имплементацией numpy.
Создание библиотеки : следующая функция определена в sum_function.c :
float sum_vector(float* data, int num_row){
float value = 0.0;
for (int i = 0; i < num_row; i++){
value += data[i];
}
return value;
}
Компиляция библиотеки : общая библиотека sum.so создается
clang -c sum_function.c
clang -shared -o sum.so sum_function.o
Измерение : простой numpyсоздается массив, и сумма его элементов вычисляется с использованием вышеуказанной функции.
from ctypes import *
import numpy as np
N = int(1e7)
data = np.arange(N, dtype=np.float32)
libc = cdll.LoadLibrary("sum.so")
libc.sum_vector.restype = c_float
libc.sum_vector(data.ctypes.data_as(POINTER(c_float)),
c_int(N))
Вышеуказанная функция занимает 30 мс.Однако, если я использую numpy.sum, время выполнения составляет всего 4 мс.
Так что мой вопрос: что делает numpy намного быстрее, чем моя реализация на C?Я не могу думать ни о каком улучшении с точки зрения алгоритма для вычисления суммы вектора.