следуя вот этой статье http://sage.math.washington.edu/home/dagss/numerical-cython-preprint.pdf попытался ускорить тако код:
#!/usr/bin/python
from numpy import *
def matrix(bRow, bCol, out=None):
for i in range(len(bRow)):
for j in range(len(bCol)):
tmp=0.0
for k in range(len(bRow[i])):
tmp+=0.000001*(linalg.norm(bRow[i][k]))
for k in range(len(bCol[j])):
tmp+=0.000001*(linalg.norm(bCol[j][k]))
out[i][j]=tmp
в результате получи следующий код:
#!/usr/bin/python
import numpy as np
cimport numpy as np
cimport cython
ctypedef np.float64_t dtype_t
#ctypedef double dtype_t
@cython.boundscheck(False)
@cython.wraparound(False)
def matrix(np.ndarray[dtype_t, ndim=3] bRow,np.ndarray[dtype_t, ndim=3] bCol,np.ndarray[dtype_t, ndim=2] out=None):
# cdef long i,j,k
cdef Py_ssize_t i,j,k
cdef dtype_t tmp
for i in range(bRow.shape[0]):
for j in range(bCol.shape[0]):
tmp=0.0
for k in range(bRow.shape[1]):
tmp+=0.000001*(np.linalg.norm(bRow[i][k]))
for k in range(bCol.shape[1]):
tmp+=0.000001*(np.linalg.norm(bCol[j][k]))
out[i][j]=tmp
После замеров времени в среднем оказалось, что первый и второй вариант работают 2 с половиной минуты. Т.е ни о каком ускорении речи быть и не может. А в статье после типизации обещается ускорение в 130-150 раз, а после отмены проверок в 620 раз.
Что я сделал не так???
P.S. сборка so модуля выполнялась так
$ cython matrixx.pyx
$ gcc -c -fPIC -I/usr/include/python2.7/ matrixx.c
$ gcc -shared matrixx.o -o matrixx.so