Полагаю, вы даже можете попробовать более простую задачу
MATLAB
function test
szA=[1024,1280]; HfszA=[512,640];
[aPx,aPy]=meshgrid(-HfszA(2):HfszA(2)-1,-HfszA(1):HfszA(1)-1);
fx=1.0; fy=2.0;
tic
for i=1:2000
F=sum(sum(fx*aPx+fy*aPy));
end
toc
disp(F)
выходы
Истекшее время составляет 9,566274 секунды.
-1966080
Python
import numpy as np
import time
szA=[1024,1280]; HfszA=[512,640]
aPx,aPy=np.meshgrid(np.arange(-HfszA[1],HfszA[1]),np.arange(-HfszA[0],HfszA[0]))
fx=1.0
fy=2.0
start = time.time()
for i in range(2000):
F = np.sum(np.sum(fx*aPx+fy*aPy, axis=0))
end = time.time()
print("Elapsed (after compilation) = %s" % (end - start))
print(F)
выходы
Истек (после компиляции) = 33,3840000629
-1966080.0
Я считаю, что разница между ними в два раза:
- Matlab использует OpenMP при выполнении многих операций с массивами
- использует набор инструкций AVX.
Причина, по которой я пришел к такому заключению, заключается в том, чтобы посмотреть на использование процессора на моем Core i3 с четырьмя ядрами (вы можете проверить количество ядер на вашем процессоре), с помощью сценария python он равен 30%, с matlab - 100%.
Что касается набора инструкций AVX, то я просто однажды сравнил работу MATLAB matmul сEigen's one (http://eigen.tuxfamily.org/index.php?title=Main_Page), и для соответствия производительности мне пришлось скомпилировать Eigen с -openmp и -axAVX.
Чтобы, наконец, ответить на ваш вопрос, я не думаю, что вы можете сделать код Python быстрее, если не сможете скомпилировать базовую библиотеку с помощью openmp, директивы AVX.
Вот учебник https://docs.scipy.org/doc/scipy/reference/building/linux.html
Удачи, дайте нам знать, как все прошло.