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之间。 为什么时间上会有这么大的差异?
答案 0 :(得分:4)
我可以看到两个可能的原因:
item * item
产生与item ** 2
相同的结果,但您对**
运算符的实现做出了假设。更重要的原因是...... lambda
实际上是一个函数 - 它与你在同一范围内用def
声明的函数具有相同的闭包,并且与这样的函数一样,它将获得它自己的函数执行时堆栈帧。创建,推送和删除这样的框架需要时间,这可能是引入如此大的开销的原因。引自here:在语义上,他们(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>