Python的地图和过滤器真的非常快,还是我的测量错了?

时间:2016-06-17 15:42:54

标签: python numpy

我对矢量/列表上的操作进行了一些速度测试。令人惊讶的是,mapfilter似乎比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

mapfilter是否真的比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()

如果我的测量结果是正确的,为什么它的速度要快得多?

1 个答案:

答案 0 :(得分:3)

我的猜测是c = map(lambda x, y: x + y, a, b)实际上没有计算出来。在python 3中,mapfilter被评估为惰性,因此在它们不得不被评估之前。

您可以在停止计时器之前添加list(c)来验证这一点,但这可能会影响列表创建的时间。