在NumPy数组上迭代时,Numba看起来比Cython快得多。
我可能缺少哪些Cython优化?
下面是一个简单的例子:
纯Python代码:
import numpy as np
def f(arr):
res=np.zeros(len(arr))
for i in range(len(arr)):
res[i]=(arr[i])**2
return res
arr=np.random.rand(10000)
%timeit f(arr)
每环4.81ms±72.2s(平均±std )。dev.7次运行中,每一次循环100次)
Cython代码
%%cython
import numpy as np
cimport numpy as np
def cy_sum(int n):
cdef double s=0
cdef int i
for i in range(n):
s += np.sqrt(i)
return s
如上所示,我有计算平方根和的代码。通过使用cython -a,我得到了图片中的结果。cython代码在函数调用np.sqrt(i)时与python交互,与纯python代码相比没有任何改进。
我不知道在指定变量类型时是否做错了什么。还有其他解决方案,例如使用i*
当对数组执行操作时,我有一个关于Numpy内存使用情况的问题。我观察到,内存使用量增加了一倍,尽管这似乎是不必要的。例如,对于以下两个脚本,第二个脚本使用的内存几乎是第一个脚本的两倍:
第一个脚本:
# ex1.py
import numpy as np
x = np.zeros((10000, 10000), dtype=np.float32)
np.sum(x)
第二稿
# ex2.py
import numpy as np
x = np.zeros((10000, 10000), dtype=np.float32)
np.sum(x+x) # this is just a toy op
我正在比较Python加速器(Numba,Cython,f2py)与simple For loops和Numpy的einsum来解决特定问题(见下文)。到目前为止,Numpy是解决这个问题最快的(快6倍),但如果我应该尝试额外的优化,或者如果我做错了什么,我想要一些反馈。这个简单的代码基于一个较大的代码,它有许多这样的einsum调用,但没有显式的for循环。我在检查这些加速器有没有能做得更好的。
在Mac OS X Yosemite上使用Python 2.7.9完成的计时,并从Homebrew安装了gcc-5.3.0 (-- with -fortran - with multilib)。我还
如何优化这段代码(不使用矢量化,因为这会导致使用计算的语义,这通常是非常重要的):
slow_lib.py:
import numpy as np
def foo():
size = 200
np.random.seed(1000031212)
bar = np.random.rand(size, size)
moo = np.zeros((size,size), dtype = np.float)
for i in range(0,size):
for j in range(0,size):
val = bar