我在研究Python中循环类结构的性能问题时发现了以下语句:
Besides the syntactic benefit of list comprehensions, they are often as fast or faster than equivalent use of map. (Performance Tips)
List comprehensions run a bit faster than equivalent for-loops (unless you're just going to throw away the result). (Python Speed)
我想知道到底是什么区别让列表理解有了这个优势。谢谢。在
测试一:丢弃结果。在
这是我们的虚拟函数:
以下是我们的挑战者:
^{pr2}$我不会对它的原始速度进行分析,只会根据操作员的问题来分析它的原始速度。让我们看看机器代码的差异。在
比赛开始了。Listcomp的第一步是构建一个空列表,而for循环的第一步是设置一个循环。然后,它们都继续加载global range(),常量100,并调用生成器的range函数。然后它们都获取当前迭代器和下一个项,并将其存储到变量i中,然后加载examplefunc和i并调用examplefunc。Listcomp将它追加到列表中,并重新开始循环。For循环在三条指令而不是两条指令中执行相同的操作。然后他们都不加载并返回。在
那么,在这个分析中,谁看起来更好呢?在这里,如果您不关心结果,list comprehension会执行一些冗余操作,例如构建列表并将其附加到列表中。For循环也相当有效。在
如果你给它们计时,使用for循环大约比列表理解快三分之一。(在这个测试中,examplefunc将它的参数除以5,然后将它丢弃,而不是什么都不做。)
测试二:保持结果正常。在
这个测试没有虚拟功能。我们的挑战者是:
今天这个差别对我们没用。只是两个街区的两个机器代码。在
列出公司机器代码:
循环机器代码:
正如您可能已经知道的,列表理解的指令比for循环少。在
列出理解检查表:
range
。在100
。在range
。在i
。在i
。在l
指向匿名空列表。在For loop的检查表:
l
指向匿名空列表。在range
。在100
。在range
。在i
。在l
。在append
。在i
。在append
。在(不包括以下步骤:Load
None
,返回它。)列表理解不必做这些事情:
i
两次总之,如果要使用这些值,listcomp要快得多,但如果不使用,则相当慢。在
实际速度
测试一:for循环快三分之一*
测试二:列表理解速度快三分之二*
*大约->;第二个小数位
相关问题 更多 >
编程相关推荐