Я новичок в Python, который пытается немного узнать об этом фантастическом языке программирования.Я попытался использовать scipy.weave.inline, чтобы ускорить некоторые вычисления.Просто чтобы немного узнать, я попытался реализовать умножение матриц, используя scipy.weave.inlineЯ не включил обработку ошибок - просто попробовал это, чтобы лучше понять это.Код выглядит следующим образом:
import scipy.weave
def cmatmul(A,B):
R = numpy.zeros((A.shape[0],B.shape[1]))
M = R.shape[0]
N = R.shape[1]
K = A.shape[1]
code = \
"""
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
for (int k=0; k<K; k++)
R(i,j) += A(i,k) * B(k,j);
"""
scipy.weave.inline(code, ['R','A','B','M','N','K'], \
type_converters=scipy.weave.converters.blitz, \
compiler='gcc')
return R
Когда я сравниваю с numpy.dot, я обнаруживаю, что версия weave.inline занимает примерно 50 раз больше времени, чем numpy.dot.Я знаю, что NumPy очень быстро, когда его можно применить.Разница наблюдается даже для больших матриц, таких как размер 1000 x 1000.
Я проверил как numpy.dot, так и scipy.weave.inline, и оба, кажется, используют одно ядро 100% при вычислениях.Numpy.dot обеспечивает 10,0 GFlops по сравнению с теоретическими 11,6 GFlops моего ноутбука (двойная точность).В одной точности я измеряю двойную производительность, как и ожидалось.Но scipy.weave.inline далеко позади.В 1/50 раза выше этого показателя для scipy.weave.inline.
Ожидается ли эта разница?Или что я делаю не так?