我需要实现一个函数,用可变的节长度对数组的元素求和。 所以
a = np.arange(10)
section_lengths = np.array([3, 2, 4])
out = accumulate(a, section_lengths)
print out
array([ 3., 7., 35.])
我尝试在cython
中实现:
https://gist.github.com/2784725
在性能方面,我将与纯粹的numpy
解决方案进行比较,在这种情况下,部分长度都是相同的:
你有什么改进工作的建议吗?在
您可以尝试以下方法:
除了
@cython.boundscheck(False)
编译器指令,还可以尝试添加@cython.wraparound(False)
在
setup.py
脚本中,尝试添加一些优化标志:ext_modules = [Extension("accumulate", ["accumulate.pyx"], extra_compile_args=["-O3",])]
查看
cython -a accumulate.pyx
生成的.html文件,看看是否有部分缺少静态类型或严重依赖Python C-API调用:http://docs.cython.org/src/quickstart/cythonize.html#determining-where-to-add-types
在方法的末尾添加
return
语句。目前它正在你的紧循环中做一堆不必要的错误检查。不确定它是否会产生影响,但我倾向于生成循环计数器
cdef unsigned int
,而不仅仅是int
当
section_lengths
不相等时,您还可以将您的代码与numpy进行比较,因为它可能需要的不仅仅是一个简单的sum
。在在nest for loop update
out[i_bas]
很慢的情况下,您可以创建一个临时变量来执行accumerate,并在nest for loop完成后更新out[i_bas]
。以下代码将与numpy版本一样快:相关问题 更多 >
编程相关推荐