Недавно я преобразовал MATLAB script в Python с помощью Numpy и обнаружил, что он работает значительно медленнее. Я ожидал подобную производительность, поэтому мне интересно, что я делаю что-то неправильно.
Как урезанный пример, я вручную суммирую геометрический ряд:
Версия MATLAB:
function s = array_sum(a, array_size, iterations)
s = zeros(array_size);
for m = 1:iterations
s = a + 0.5*s;
end
end
% benchmark code
array_size = 500
iterations = 500
a = randn(array_size)
f = @() array_sum(a, array_size, iterations);
fprintf('run time: %.2f ms\n', timeit(f)*1e3);
Версия Python/Numpy:
import numpy as np
import timeit
def array_sum(a, array_size, iterations):
s = np.zeros((array_size, array_size))
for m in range(iterations):
s = a + 0.5*s
return s
array_size = 500
iterations = 500
a = np.random.randn(array_size, array_size)
timeit_iterations = 10
t1 = timeit.timeit(lambda: array_sum(a, array_size, iterations),
number=timeit_iterations)
print("run time: {:.2f} ms".format(1e3*t1/timeit_iterations))
На моей машине MATLAB заканчивается через 58 мс. Версия Python работает в 292 мс, или на 5X медленнее.
Я также попытался ускорить код Python, добавив декоратор Numba JIT @jit('f8[:,:](i8, i8)', nopython=True)
, но время только упало до 236 мс (на 4 раза медленнее).
Это медленнее, чем я ожидал. Я использую timeit неправильно? Что-то не так с моим кодом Python?
EDIT: отредактировано так, что случайная матрица создается вне контрольной функции.
РЕДАКТИРОВАТЬ 2: Я использовал контрольную точку вместо Torch (вычисляя сумму как s = torch.add(s, 0.5, a)
), и она работает всего на 52 мс на моем компьютере!