Cython дополнительная типизация и cimport для массива numpy замедляют производительность? - PullRequest
3 голосов
/ 03 января 2012

Ниже приведены два простых метода 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

1 Ответ

0 голосов
/ 05 января 2012

Я тестировал ваш код, g_cython немного быстрее, чем g_less_cython.

вот код теста

import pyximport; pyximport.install()
import search_sorted
import numpy as np
import time
x = np.arange(100000, dtype=np.int32)
y = np.random.randint(0, 100000, 100000)

start = time.clock()
search_sorted.g_cython(y, x)
print time.clock() - start

start = time.clock()
search_sorted.g_less_cython(y, x)
print time.clock() - start

вывод:

0.215430514708
0.259622599945

Я выключил флаг проверки границ и переноса:

@cython.boundscheck(False)
@cython.wraparound(False)
def g_cython(np.ndarray[np.int_t, ndim = 1] a, percentile):
    ....

Разница не ощутима, потому что вызов np.searchsorted (процентиль, a [i]) является критической частью, которая использует большую часть ЦП.

...