Python:为什么将生成器转换为列表需要很长时间

时间:2014-01-25 22:06:39

标签: python generator

虽然为API创建了一些JSON输出,但我使用生成器来确保转换过程是可伸缩的,然后将其输出转换为列表,以便可以将其作为JSON列表插入到更大的JSON对象中objects(this_list)。

通过迭代创建生成器足够快 - 100个项目1-200毫秒 - 但是然后将生成器转换为列表大约需要10秒钟:

def create_a_list_of_objects(dataset):

    these_items = (do_some_processing_to_each_item(item) for item in dataset)

    >>> 0.15

    convert_to_list = list(these_items)

    >>> 8.75

    return convert_to_list

json.dumps({

   this_list: create_a_list_of_objects(datset)

})

如果我只是通过列表理解直接运行它,那么完成它需要大约10秒钟。

return [do_some_processing_to_each_item(item) for item in dataset]

>>> 10.41

如果我将其分解为显式循环,则do_some_processing_to_each_item的每次迭代大约需要0.03,总共大约3秒(我假设这与列表理解之间的差异是由于输出的大小) do_some_processing_to_each_item:一个相当大的字典。)

为什么这最后一步花了这么长时间,是否有更快的方法将生成器的输出转换为列表?

是否存在可扩展且快速的替代策略?

编辑

在回复评论时,我在原帖中添加了其他信息。

2 个答案:

答案 0 :(得分:1)

您不是在上面的代码中“迭代生成器”(当您创建列表时本质上除外),所以除非您单独执行此操作,否则您没有基准。您的生成器表达式

(do_some_processing_to_each_item(item) for item in dataset)

只需创建生成器;在调用these_items.__next__()之前不会进行处理(因为当你遍历these_items时,每个项目都是如此)。

要排除列表创建/存储作为瓶颈,您可以计算时间:

for item in these_items:
    do_some_processing_to_each_item(item)

答案 1 :(得分:0)

为什么不直接使用列表组合,例如:

return [do_some_processing_to_each_item(item) for item in dataset]