当使用范围表达式迭代一个大阵,我应该使用Python内置的range函数,或numpy的的arange
,以获得最佳的性能?
到目前为止,我的理由:
arange
可能会采用本地实现,并且可能会更快,因此, 在另一方面, arange
返回一个全阵列,其占用的内存,因此有可能是一个开销。 Python 3中的范围表达式是一个发生器,它不会在存储器保存所有的值。
当使用范围表达式迭代一个大阵,我应该使用Python内置的range函数,或numpy的的arange
,以获得最佳的性能?
到目前为止,我的理由:
arange
可能会采用本地实现,并且可能会更快,因此, 在另一方面, arange
返回一个全阵列,其占用的内存,因此有可能是一个开销。 Python 3中的范围表达式是一个发生器,它不会在存储器保存所有的值。
对于大型阵列numpy的应该是更快的解决方案。
在numpy的,你应该使用矢量计算,组合ufuncs和索引来解决你的问题,因为它运行在C
速度。 与此相比遍历numpy的阵列是低效的。
(喜欢的东西,你可以做的是遍历与创建索引阵列上最糟糕的事情range
或np.arange
在你的问题的第一句话暗示,但我不知道,如果你真的这样想。)
import numpy as np
import sys
sys.version
# out: '2.7.3rc2 (default, Mar 22 2012, 04:35:15) \n[GCC 4.6.3]'
np.version.version
# out: '1.6.2'
size = int(1E6)
%timeit for x in range(size): x ** 2
# out: 10 loops, best of 3: 136 ms per loop
%timeit for x in xrange(size): x ** 2
# out: 10 loops, best of 3: 88.9 ms per loop
# avoid this
%timeit for x in np.arange(size): x ** 2
#out: 1 loops, best of 3: 1.16 s per loop
# use this
%timeit np.arange(size) ** 2
#out: 100 loops, best of 3: 19.5 ms per loop
因此,对于这种情况下numpy的比使用快4倍xrange
如果你这样做是正确的。 根据您的问题numpy的速度会更快比4或5倍加速。
对这些问题的答案这个问题说明了使用numpy的阵列,而不是蟒蛇列出了大型数据集的一些有利条件。
首先,作为写@bmu, 你应该使用矢量计算,ufuncs和索引的组合 。 确实有一些情况下,需要明确的循环,但这些都是真难得。
如果需要显式循环,与Python 2.6和2.7,你应该使用的xrange(见下文)。 从你说的话,在Python 3, 范围是一样的xrange(返回发电机)。 因此,也许范围是对你太好。
现在,你应该自己尝试(使用timeit: - 这里的IPython的“神奇功能”):
%timeit for i in range(1000000): pass
[out] 10 loops, best of 3: 63.6 ms per loop
%timeit for i in np.arange(1000000): pass
[out] 10 loops, best of 3: 158 ms per loop
%timeit for i in xrange(1000000): pass
[out] 10 loops, best of 3: 23.4 ms per loop
再次,如上所述,大部分的时间,它是能够使用numpy的矢量/阵列式(或ufunc等...),其运行速度AC: 快得多 。 这就是我们可以称之为“矢量编程”。 它使程序在年底更容易比C来实现(和更具可读性),但几乎一样快。