Ниже приведены два простых метода Cython, которые я написал. В методе g_cython() я использовал дополнительную типизацию для массива numpy a и b, но удивительно, что 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(percentile) = 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
dtype=int
вnp.zeros
, иначе он создает массив двойников (хотя, возможно, это зависит от версия cython?). Кроме того, было бы полезно, если бы вы предоставили типичный пример использования. В любом случае, если вы хотите сравнить, что делает cython в каждом случае, вы можете создать файл с помощьюcython -a
, который дает вам красиво отформатированный html-файл, в котором нажатие на строки кода python показывает соответствующий сгенерированный код C. - person James   schedule 03.01.2012