我有一个慢循环,我想把它推到numpy中(快得多)。我已经花了好几天时间在玩这个代码,却一无所获。有没有可能,或者是我错过了一个新的把戏?我能做些重构吗?在
如您所见,我想将mixin加总为x的移位。在
import numpy as np
blocksize = 1000 # Chosen at runtime.
mixinsize = 100 # Chosen at runtime.
count = 10000 # Chosen at runtime.
xs = np.random.randint(0, blocksize + 1, count) # In practice this is data.
mixins = np.empty((count, mixinsize)) # In practice this is data.
# The slow part:
accumulator = np.zeros(blocksize + mixinsize)
for i in xrange(count):
accumulator[xs[i]:xs[i] + mixinsize] += mixins[i]
从中获得0.11(还不是0.12)numba.pydata.org. 现在我们可以使用LLVM jit编译以下代码:
^{pr2}$
好的,这几乎是50倍的加速,只需要额外的三行Python代码。在
现在我们还可以使用clang/LLVM作为编译器测试一个纯C版本进行比较。在
因此,使用-Ofast进行优化时,Numba的速度大约是普通C版本的一半。相比之下,使用-O2的运行时大约为8毫秒,这意味着在本例中numbajit编译的Python的速度大约是带有-O2优化标志的C的75%。这对于另外三行Python代码来说并不坏。在
我们可以看一个简单的Python版本进行比较:
这段Python代码在1775毫秒内执行。因此,相对于普通Python,使用NumPy可以获得大约3倍的加速,使用Numba可以获得150倍的加速,使用C和-Ofast可以得到350x的加速。在
Donald Knuth的一句警告他将此归因于C.A.R.Hoare:“过早优化是计算机编程中所有邪恶的根源。”虽然这似乎是令人印象深刻的相对加速,但沿着这条路线前进的绝对加速只允许我们节省一些毫秒的CPU时间。我的时间真的值得我花时间从那么多的劳动中节省CPU吗?你的时间值得吗?你自己决定。在
相关问题 更多 >
编程相关推荐