【发布时间】:2014-05-25 17:12:53
【问题描述】:
总结:
你们太棒了...我的真实代码工作正常。我采纳了 JoshAdel 的建议,即:
1) 将所有 ndarray 更改为类型化内存视图 2) 手动展开所有 numpy 数组计算 3) 使用静态定义的 unsigned int 作为索引 4) 禁用边界检查和环绕
另外,非常感谢 Veedrac 的洞察力!
原帖:
我知道python做这些代码真的很慢:
import numpy as np
def func0():
x = 0.
for i in range(1000):
x += 1.
return
如果我将其更改为 Cython,它会更快:
import numpy as np
cimport numpy as np
def func0():
cdef double x = 0.
for i in range(1000):
x += 1.
return
结果如下:
# Python
10000 loops, best of 3: 58.9 µs per loop
# Cython
10000000 loops, best of 3: 66.8 ns per loop
但是,现在我有了这种代码,它不是单个数字的循环,而是数组的循环。 (是的...我正在求解 PDE,所以会发生这种情况)。
我知道下面的例子很愚蠢,但只是尝试了解计算类型:
纯蟒蛇:
def func1():
array1 = np.random.rand(50000, 4)
array2 = np.random.rand(50000)
for i in range(1000):
array1[:, 0] += array2
array1[:, 1] += array2
array1[:, 2] += array2
array1[:, 3] += array2
return
赛通:
def func1():
cdef np.ndarray[np.double_t, ndim=2] array1 = np.random.rand(50000, 4)
cdef np.ndarray[np.double_t, ndim=1] array2 = np.random.rand(50000)
for i in range(1000):
array1[:, 0] += array2
array1[:, 1] += array2
array1[:, 2] += array2
array1[:, 3] += array2
return
而且几乎没有任何改善。同时,我知道 Python 不擅长处理这些巨大的循环,因为开销很大。
# Python
1 loops, best of 3: 299 ms per loop
# Cython
1 loops, best of 3: 300 ms per loop
关于如何改进这类代码有什么建议吗?
【问题讨论】:
-
嗯。可能是您沿着慢速索引循环?
标签: python arrays numpy cython