【问题标题】:Python Generator that yields more results takes more time to create产生更多结果的 Python 生成器需要更多时间来创建
【发布时间】:2014-04-08 11:31:57
【问题描述】:

我在 Python 中有以下代码:

import time
import sys

def returnlist(times):
    t = time.time()
    l = [i for i in range(times)]
    print "list: {}".format(time.time() - t)
return l

def returngenerator(times):
    t = time.time()
    g = (i for i in range(times))
    print "generator: {}".format(time.time() - t)
    return g

g = returngenerator(times)
l = returnlist(times)

1.For times = 1000000 我得到结果:

生成器:0.107323884964

列表:0.225493192673

2. For times = 10000000 我得到:

生成器:0.856524944305

列表:1.83883309364

我明白为什么创建第二个列表需要更多时间,但为什么第二个生成器也需要更多时间?我假设由于延迟评估,创建第一个生成器需要大约相同的时间。

我在 Ubuntu 虚拟机上运行这个程序

【问题讨论】:

  • 你在运行 Python 2 吗?如果是这种情况,请使用xrange 而不是range。
  • @Carsten 是完全正确的,这在 python-2 中较慢的原因是range 只是在 python-3 评估完整列表之前变得懒惰(即返回一个生成器)。
  • 所以我认为我不应该在 bulding 生成器中使用 range()。使用 range() 是否意味着每次要返回一个新的生成器值时,都应该再次创建整个 range() 列表?
  • 另外,如果你使用'timeit'模块进行时序分析,你会更好。像这样说:import timeit; t1=timeit.Timer(setup='x=100000',stmt='(y for y in xrange(x))');t1.timeit(1000)
  • 我会记住这一点的。

标签: python generator


【解决方案1】:

您的代码中的问题是range 函数。在 Python 2 中,它创建一个列表。对于像您的基准测试中的大型列表,这会成为一个问题。在 Python 3 中,range 返回一个生成器。 Python 2 的一种解决方法是使用 xrange 函数,该函数也是惰性的。

作为测试,让我们创建一个与您类似的基准函数,但使用 xrange:

def returngenerator2(times):
    t = time.time()
    g = (i for i in xrange(times))
    print "generator2: {}".format(time.time() - t)
    return g

并对其进行测试:

>>> l = returnlist(10**7)
list: 0.580000162125
>>> g = returngenerator(10**7)
generator: 0.115000009537
>>> x = returngenerator2(10**7)
generator2: 0.0
>>> x2 = returngenerator2(10**8)
generator2: 0.0
>>> x3 = returngenerator2(10**9)
generator2: 0.0

似乎有效。 :)

【讨论】:

    【解决方案2】:

    因为range() 在 Python 2 中返回一个实际列表。在 Python 3 中,这已更改为 range() 是一个生成器。在 Python 2 中使用 xrange() 来提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 2023-04-10
      • 1970-01-01
      • 2013-04-20
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      相关资源
      最近更新 更多