【发布时间】:2013-09-10 00:25:22
【问题描述】:
在下面的简单示例中,有两个函数可以对随机数列表进行排序。第一种方法传递sorted一个生成器表达式,第二种方法先创建一个列表:
import random
l = [int(1000*random.random()) for i in xrange(10*6)]
def sort_with_generator():
return sorted(a for a in l)
def sort_with_list():
return sorted([a for a in l])
使用line profiler 进行基准测试表明第二个选项 (sort_with_list) 的速度大约是生成器表达式的两倍。
谁能解释发生了什么,为什么第一种方法比第二种慢很多?
【问题讨论】:
-
您是否在列表示例中的每个元素上加 1?
-
我很茫然。您可以将两者隔离并分别进行基准测试吗?也许解释器正在对列表进行一些智能缓存或类似的奇怪事情。
-
列表理解一次在内存中创建整个列表,而生成器表达式通过传递给排序函数的元组提供结果序列的每个元素。因此,列表理解更快,但它消耗更多的内存。生成器表达式速度较慢,但在任何给定时间仅为列表的一个元素保留内存。有关更多信息,请查看此问题:stackoverflow.com/questions/47789/…
-
@elyase 道歉,在粘贴过程中偷偷进入 - 不,除了表达式之外,它们应该是相同的。
-
问题可以简化为
list(a for a in l)vs.[a for a in l]。这就是差异的来源。后者的速度与使用 sorted 时相同。
标签: python performance generator