Python 与列表理解相比,生成器速度较慢

Python 与列表理解相比,生成器速度较慢,python,performance,Python,Performance,据我所知,当我们只想使用一次值时,我们可以使用生成器。使用下面的两个例子,我的逻辑是第二个应该更快,因为第一个先创建一个列表,然后循环值。。而第二个仅处理来自生成器的值。然而,当我计算时间时,列表理解总是比生成器快。为什么会这样 第一: 第二: 是的,生成器和GeneXPR通常(嘿)比列表理解慢,但另一方面,它们被惰性地评估,并且您也不必为完全预计算的列表支付内存成本。我认为速度差异是由调用帧开销(隐式或显式)yield抛出值引起的 使用您的代码,但timeit测量它,第三个版本使用生成器功能:

据我所知,当我们只想使用一次值时,我们可以使用生成器。使用下面的两个例子,我的逻辑是第二个应该更快,因为第一个先创建一个列表,然后循环值。。而第二个仅处理来自生成器的值。然而,当我计算时间时,列表理解总是比生成器快。为什么会这样

第一:

第二:


是的,生成器和GeneXPR通常(嘿)比列表理解慢,但另一方面,它们被惰性地评估,并且您也不必为完全预计算的列表支付内存成本。我认为速度差异是由调用帧开销(隐式或显式)
yield
抛出值引起的

使用您的代码,但
timeit
测量它,第三个版本使用生成器功能:

import timeit

def f1():
    x = []
    for j in [i**2 for i in range(20000)]:
        x.append(j)
    return x

def f2():
    x = []
    for j in (i**2 for i in range(20000)):
        x.append(j)
    return x


def f3():
    def gen():
        for i in range(20000):
            yield i ** 2
    x = []
    for j in gen():
        x.append(j)
    return x


print(timeit.timeit(f1, number=100))
print(timeit.timeit(f2, number=100))
print(timeit.timeit(f3, number=100))
结果(Python3.7.0)似乎表明GeneXPR与生成器函数一样快,大约比列表理解慢4-5%

f1 = 2.882695159
f2 = 3.0303254170000002
f3 = 3.002670741

您使用的是哪个python版本?因为range在Python2中返回了一个列表,并且在Python3中返回了一个生成器…@quant Python3,但是这两个示例都包含
range
您可以发布用于为这两种方法计时的代码吗?@Ev.Kounis已经添加了时间计算。可能是重复的,谢谢。因此,使用生成器在内存方面效率更高,但这并不总是意味着它比消耗更多内存的生成器更快?这就是它的要点!
import timeit

def f1():
    x = []
    for j in [i**2 for i in range(20000)]:
        x.append(j)
    return x

def f2():
    x = []
    for j in (i**2 for i in range(20000)):
        x.append(j)
    return x


def f3():
    def gen():
        for i in range(20000):
            yield i ** 2
    x = []
    for j in gen():
        x.append(j)
    return x


print(timeit.timeit(f1, number=100))
print(timeit.timeit(f2, number=100))
print(timeit.timeit(f3, number=100))
f1 = 2.882695159
f2 = 3.0303254170000002
f3 = 3.002670741