我做了个测试
%timeit list(map(lambda x:x,range(100000)))
%timeit [(lambda x:x)(i) for i in range(100000)]
给予
29 ms ± 4.4 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
51.2 ms ± 3.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
为什么python中的lambda函数在列表理解上比在map中慢
TLDR:理解每次都会评估其整个表达式。A
map
对其表达式求值一次,并每次应用结果输入到
map
的表达式和理解的处理方式不同。map
和理解的重要部分可以用以下方式翻译:重要的区别在于
map
已经接收到函数,而comprehension
接收到表达式现在,
lambda x:x
是一个表达式,的计算结果是一个函数值得注意的是,计算表达式以获得函数是一项需要时间的操作
因为
map
和理解期望不同的事物,所以lambda
传递给它们的方式不同。解释器的功能可以通过显式eval
/compile
扩展:重要的区别现在应该清楚了:
map
,表达式在传递到map
之前被计算一次。对于每个项,map
调用结果函数李>comprehension
,表达式以未赋值的形式传递。对于每个项,comprehension
构造函数,然后调用结果函数李>重要的是要注意
map
并不总是比理解快map
创建/查找一次函数会带来好处。然而,函数调用是昂贵的,理解不必使用函数通常,如果表达式只使用理解的局部名称,则速度更快
如果表达式本身需要动态地执行代价高昂的操作,
map
将不会受益因为在第一个代码段中,
lambda
只创建一次并执行100000次,而在第二个代码段中,它在每次迭代中都创建并执行老实说,我感到惊讶的是,两者之间的差异并没有更大,但你们的两个计时应该会进一步分开,因为它的长度最大
作为旁注,请注意,即使将
lambda
更改为不必首先创建而只需查找的内置函数,也会得到相同的趋势:可以通过将函数绑定到变量来实现改进,但是
list(map())
方案速度更快至于为什么到局部变量的绑定更快,您可以找到更多信息here
相关问题 更多 >
编程相关推荐