【发布时间】:2016-05-03 09:58:08
【问题描述】:
我的印象是 numpy 对于列表操作会更快,但以下示例似乎表明并非如此:
import numpy as np
import time
def ver1():
a = [i for i in range(40)]
b = [0 for i in range(40)]
for i in range(1000000):
for j in range(40):
b[j]=a[j]
def ver2():
a = np.array([i for i in range(40)])
b = np.array([0 for i in range(40)])
for i in range(1000000):
for j in range(40):
b[j]=a[j]
t0 = time.time()
ver1()
t1 = time.time()
ver2()
t2 = time.time()
print(t1-t0)
print(t2-t1)
输出是:
4.872278928756714
9.120521068572998
(我在 i7 920 上的 Windows 7 中运行 64 位 Python 3.4.3)
我知道这不是复制列表的最快方法,但我正在尝试找出我是否错误地使用了 numpy。还是说 numpy 对于这种操作比较慢,只在更复杂的操作中效率更高?
编辑:
我还尝试了以下方法,它只是通过 b[:] = a 直接复制,numpy 仍然慢两倍:
import numpy as np
import time
def ver6():
a = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
b = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
for i in range(1000000):
b[:] = a
def ver7():
a = np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
b = np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
for i in range(1000000):
b[:] = a
t0 = time.time()
ver6()
t1 = time.time()
ver7()
t2 = time.time()
print(t1-t0)
print(t2-t1)
输出是:
0.36202096939086914
0.6750380992889404
【问题讨论】:
-
NumPy 新手的经验法则:如果您的代码中包含
for一词,那么您将无法获得 NumPy 的好处。 -
构造 numpy 数组需要一些时间。然而,在构造它们之后,进一步的操作比使用普通 Python 列表要快得多。由于您在每次循环迭代中都构造了两个新的 numpy 数组,因此它比使用 Python 列表要慢得多才有意义。
-
@pzp 不,numpy 数组只创建一次。
-
@pzp 正是出于这个原因,我更改了代码以在函数之外构造数组,将其简化为单个函数并在没有该因素的情况下对其进行计时。还是一样。
-
@roganjosh 你确定吗?我只是自己计时,不包括数组构造,并且 user2357112 正确使用了 numpy 和 numpy killed vanilla——它甚至没有接近。此外,这是一个构建得很糟糕的测试......结果正在被缓存。
标签: python performance numpy