哪个通常更快,产量还是追加?

Kit*_*Kit 16 python performance yield return generator

我目前正处于个人学习项目中,我在XML数据库中阅读.我发现自己正在编写收集数据的函数,我不确定什么是快速返回它们的方法.

这通常更快:

  1. yields,或
  2. append()在功能中的几个s然后return随后list

我很高兴知道在什么情况下yields会比append()s 快,反之亦然.

Joc*_*zel 18

yield懒惰和速度的巨大优势通常不是使用它的最佳理由.但如果它适用于您的上下文,那么没有理由不使用它:

# yield_vs_append.py
data = range(1000)

def yielding():
    def yielder():
        for d in data:
            yield d
    return list(yielder())

def appending():
    lst = []
    for d in data:
        lst.append(d)
    return lst
Run Code Online (Sandbox Code Playgroud)

这是结果:

python2.7 -m timeit -s "from yield_vs_append import yielding,appending" "yielding()"
10000 loops, best of 3: 80.1 usec per loop

python2.7 -m timeit -s "from yield_vs_append import yielding,appending" "appending()"
10000 loops, best of 3: 130 usec per loop
Run Code Online (Sandbox Code Playgroud)

至少在这个非常简单的测试中,yield比追加更快.

  • _lazy_是否意味着_low内存要求_? (3认同)
  • 我为WKdm算法编写了一个压缩器/解压缩器.在分析一个将位解包到列表中的函数之后是最慢的.我将它转换为发电机,它甚至更慢.产量版本提供约22MB/s,附加版本提供约38MB/s.所以_really_取决于你在做什么. (2认同)
  • `lst.append`查找可能会减慢`appending()`的速度.您可以在循环外部使用`append = lst.append`进行尝试. (2认同)

chr*_*yss 8

我最近问自己一个类似的问题,探索通过附加到列表或通过生成器生成列表(或元组)的所有排列的方法,并找到(对于长度为9的排列,大约需要一秒钟左右生成) :

  • 天真的方法(排列是列表,附加到列表,列表的返回列表)大约是时间的三倍 itertools.permutations
  • 使用发电机(即yield)减少大约.20%
  • 使用生成器和生成元组是最快的,大约是时间的两倍itertools.permutations.

带上一粒盐!时间和分析非常有用:

if __name__ == '__main__':
    import cProfile
    cProfile.run("main()")
Run Code Online (Sandbox Code Playgroud)


Wai*_*ung 6

有更快的替代TH4Ck的屈服().这是列表理解.

In [245]: def list_comp():
   .....:     return [d for d in data]
   .....:

In [246]: timeit yielding()
10000 loops, best of 3: 89 us per loop

In [247]: timeit list_comp()
10000 loops, best of 3: 63.4 us per loop
Run Code Online (Sandbox Code Playgroud)

当然,在不知道代码结构的情况下对这些操作进行微基准测试是相当愚蠢的.他们每个人在差异情况下都很有用.例如,如果要应用可以表达为单个表达式的简单操作,则列表理解很有用.Yield有一个显着的优势,您可以将遍历代码隔离到生成器方法中.哪一个适当取决于使用情况.