Ham*_*ish 4 python performance generator
在下面的简单示例中,有两个函数可以对随机数列表进行排序.第一种方法传递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])
Run Code Online (Sandbox Code Playgroud)
使用行分析器进行基准测试表明第二个选项(sort_with_list)的速度大约是生成器表达式的两倍.
任何人都可以解释发生了什么,为什么第一种方法比第二种方法慢得多?
您的第一个示例是迭代列表的生成器表达式.第二个示例是一个迭代列表的列表表达式.实际上,第二个例子略快一些.
>>> import timeit
>>> timeit("sorted(a for a in l)", setup="import random;l = [int(1000*random.random()) for i in xrange(10*6)]")
5.963912010192871
>>> timeit("sorted([a for a in l])", setup="import random;l = [int(1000*random.random()) for i in xrange(10*6)]")
5.021576881408691
Run Code Online (Sandbox Code Playgroud)
这样做的原因无疑是制作一个列表一次完成,而迭代生成器需要函数调用.
生成器不会像这样加速小列表(列表中有60个元素,非常小).主要是在创建长列表时节省内存.