遍历list比遍历narray快20倍



我不明白为什么在以下循环中,f?cf?慢20倍。

我理解类型定义允许Cython利用C的速度。

我在这里错过了什么?

感谢
%%cython
import numpy as np
cimport numpy as np

cpdef f1(l):
    for k in l:
        k
cpdef f1c(np.ndarray npl):
    cdef int i = 0
    for i in range(npl.shape[0]):
        npl[i]
cpdef f2(n):
    for k in n:
        k
cpdef f2c(np.ndarray npn):
    cdef int i = 0
    for i in range(npn.shape[0]):
        npn[i]

和时间:

l = ["lol"]*100000
npl = np.array(l, dtype=np.str)
n = [1]*100000
npn = np.array(n, dtype=np.int)

%timeit f1(l)
%timeit f1c(npl)
%timeit f2(n)
%timeit f2c(npn)
1000 loops, best of 3: 484 µs per loop
100 loops, best of 3: 13.1 ms per loop
1000 loops, best of 3: 483 µs per loop
100 loops, best of 3: 12.4 ms per loop

当指定数组的数据类型和维数时,numpy的循环速度至少快一个数量级:

def f2c(np.ndarray[np.int_t, ndim=1] npn):
    cdef int i = 0
    for i in range(npn.shape[0]):
        npn[i]
同样,对于字符串,我得到了一个快两倍的循环:
def f1c(np.ndarray[object, ndim=1] npl):
    cdef int i = 0
    for i in range(npl.shape[0]):
        npl[i]

在这种情况下必须使用:

npl = np.array(l, dtype=object)

相关内容

  • 没有找到相关文章

最新更新