TLDR:在cython中,为什么(或何时?)迭代一个numpy数组比迭代python列表更快?
一般来说:我之前使用过Cython并且能够在天真的python impl上获得巨大的速度,但是,弄清楚究竟需要做什么似乎并非无足轻重.
考虑以下3个sum()函数的实现.它们位于一个名为'cy'的cython文件中(很明显,这里有np.sum(),但除了我的观点之外......)
天真的蟒蛇:
def sum_naive(A):
s = 0
for a in A:
s += a
return s
Run Code Online (Sandbox Code Playgroud)
Cython的函数需要python列表:
def sum_list(A):
cdef unsigned long s = 0
for a in A:
s += a
return s
Run Code Online (Sandbox Code Playgroud)
Cython的函数需要一个numpy数组.
def sum_np(np.ndarray[np.int64_t, ndim=1] A):
cdef unsigned long s = 0
for a in A:
s += a
return s
Run Code Online (Sandbox Code Playgroud)
我希望,在运行时间方面,sum_np <sum_list <sum_naive,但是,下面的脚本演示相反(的完整性,我加np.sum())
N = 1000000
v_np = np.array(range(N))
v_list = range(N)
%timeit cy.sum_naive(v_list)
%timeit cy.sum_naive(v_np)
%timeit cy.sum_list(v_list)
%timeit cy.sum_np(v_np)
%timeit …Run Code Online (Sandbox Code Playgroud) 假设我使用字典表示一个特征向量(为什么?因为我知道这些特征是稀疏的,但稍后会详细介绍).
我该如何实现两个这样的词典的内在产品(表示为A,B)
我尝试了天真的方法:
for k in A:
if k in B:
sum += A[k] * B[k]
Run Code Online (Sandbox Code Playgroud)
但事实证明是缓慢的.
更多细节:
我正在使用字典来表示功能,因为
我真的很想计算N = 2000个不同字典(即它们的线性内核)的成对内积.