内联计算与Lambda

时间:2017-07-29 16:51:12

标签: python python-2.7 python-3.x

lst = [randint(0,i) for i in range(0,1000)]
start = time.time()
lst = [item*item for item in lst]
end = time.time()
print('%.7f' %(start - end))

f = lambda x: x**2

lst = [randint(0,i) for i in range(0,1000)]
start = time.time()
lst = [f(item) for item in lst]
end = time.time()
print('%.7f' %(start - end))

内联计算的时间范围为0.0000665到0.0000813。 而lambda的范围在0.0004215到0.0004265之间。 为什么时间上会有这么大的差异?

1 个答案:

答案 0 :(得分:4)

我可以看到两个可能的原因:

  1. item * item产生与item ** 2相同的结果,但您对**运算符的实现做出了假设。更重要的原因是......
  2. lambda实际上是一个函数 - 它与你在同一范围内用def声明的函数具有相同的闭包,并且与这样的函数一样,它将获得它自己的函数执行时堆栈帧。创建,推送和删除这样的框架需要时间,这可能是引入如此大的开销的原因。引自here
  3.   

    在语义上,他们(lambdas)只是正常的语法糖   功能定义。

    尝试以下计算基准:

    • 内联item*item
    • 内联item **2
    • def foo(x): return x*x
    • 的用法
    • def foo(x): return x**2
    • 的用法
    • lambda x: x*x
    • 的用法
    • lambda x: x**2
    • 的用法

    你会发现真正的原因(请分享这些结果,我对自己很感兴趣)。我希望有2种方法可以类似于效率,而且4种方式也相似,但比内联方式慢几个数量级。

    另外:使用time.time()的{​​{3}} intead - 它更可靠。 timeit在测量执行时间方面有更广泛的可能性列表,但我真的推荐timeit,因为它是为你想在这里完成的工作而创建的。 / p>