python生成器太慢而无法使用它.我为什么要用呢?什么时候?

frh*_*yme 1 python performance list-comprehension generator

最近我有问题,哪一个是其中最跑得最快的家伙iterator,list comprehension,iter(list comprehension)generator.然后制作如下的简单代码.

n = 1000000
iter_a = iter(range(n))
list_comp_a = [i for i in range(n)]
iter_list_comp_a = iter([i for i in range(n)])
gene_a = (i for i in range(n))

import time
import numpy as np

for xs in [iter_a, list_comp_a, iter_list_comp_a, gene_a]:
    start = time.time()
    np.sum(xs)
    end = time.time()
    print((end-start)*100)
Run Code Online (Sandbox Code Playgroud)

结果如下.

0.04439353942871094 # iterator
9.257078170776367 # list_comprehension
0.006318092346191406 # iterator of list_comprehension
7.491207122802734 # generator 
Run Code Online (Sandbox Code Playgroud)

发电机比其他东西慢.我不知道什么时候有用?

Kis*_*war 11

generators不要一次性将所有元素存储在内存中.他们yield一次一个,这种行为使他们的记忆效率.因此,当内存是约束时,您可以使用它们.

  • 这个答案突出了"发电机"优于其他结构的独特优势.应该是市场接受的答案. (3认同)
  • 我还建议添加生成器还可以让您从高延迟源构建数据。例如,如果您正在查询一个数据库,那么使用生成器您可以在结果进来后立即开始“产生”结果,而无需等待完整的数据集 (2认同)