我无法弄清楚为什么在以下循环中f?c
比f?
慢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
答案 0 :(得分:2)
当您指定数据类型和数组的维数时,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)