我对矢量/列表上的操作进行了一些速度测试。令人惊讶的是,map
和filter
似乎比numpy
高出5-10倍。请参阅以下短代码示例(下面的完整代码。):
n = 10000000
a = np.random.rand(n)
b = np.random.rand(n)
c = a + b # time = 0.07 s
d = a[a < 0.3] # time = 0.09 s
a = [random.random() for x in range(0, n, 1)]
b = [random.random() for x in range(0, n, 1)]
c = map(lambda x, y: x + y, a, b) # time = 0.006s
d = filter(lambda e: e < 0.3, a) # time = 0.001s
map
和filter
是否真的比numpy
操作快得多?或者我的测量结果有缺陷吗?您可以在下面看到完整的代码:
import numpy as np
import time
import random
class StopWatch:
def __init__(self, str):
self.str = str
self.t = time.time()
def stop(self):
t = time.time()
print("time = " + str(t - self.t) + " s for " + self.str)
n = 10000000
a = np.random.rand(n)
b = np.random.rand(n)
sw = StopWatch('numpy')
c = a + b
sw.stop()
sw = StopWatch('numpy')
d = a[a < 0.3]
sw.stop()
a = [random.random() for x in range(0, n, 1)]
b = [random.random() for x in range(0, n, 1)]
sw = StopWatch('list')
c = map(lambda x, y: x + y, a, b)
sw.stop()
sw = StopWatch('list')
d = filter(lambda e: e < 0.3, a)
sw.stop()
如果我的测量结果是正确的,为什么它的速度要快得多?
答案 0 :(得分:3)
我的猜测是c = map(lambda x, y: x + y, a, b)
实际上没有计算出来。在python 3中,map
和filter
被评估为惰性,因此在它们不得不被评估之前。
您可以在停止计时器之前添加list(c)
来验证这一点,但这可能会影响列表创建的时间。