Ниже приведены два простых метода Cython, которые я написал. В методе g_cython () я использовал дополнительную типизацию для массивов n и n, но удивительно, что g_cython () в два раза медленнее, чем g_less_cython (). Интересно, почему это происходит? Я думал, что добавление, которое сделает индексирование по a и b намного быстрее?
PS. Я понимаю, что обе функции могут быть векторизованы в NumPy - я просто изучаю трюки оптимизации Cython.
import numpy as np;
cimport numpy as np;
def g_cython(np.ndarray[np.int_t, ndim = 1] a, percentile):
cdef int i
cdef int n = len(a)
cdef np.ndarray[np.int_t, ndim = 1] b = np.zeros(n, dtype = 'int')
for i in xrange(n):
b[i] = np.searchsorted(percentile, a[i])
return b
def g_less_cython(a, percentile):
cdef int i
b = np.zeros_like(a)
for i in xrange(len(a)):
b[i] = np.searchsorted(percentile, a[i])
return b
Мой тестовый случай - когда len (a) == 1000000 и len (процентиль) = 100
def main3():
n = 100000
a = np.random.random_integers(0,10000000,n)
per = np.linspace(0, 10000000, 101)
q = time.time()
b = g_cython(a, per)
q = time.time() - q
print q
q = time.time()
bb = g_less_cython(a, per)
q = time.time() - q
print q