迭代生成器和列表之间的速度差异

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)的速度大约是生成器表达式的两倍.

任何人都可以解释发生了什么,为什么第一种方法比第二种方法慢得多?

Len*_*bro 6

您的第一个示例是迭代列表的生成器表达式.第二个示例是一个迭代列表的列表表达式.实际上,第二个例子略快一些.

>>> 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个元素,非常小).主要是在创建长列表时节省内存.