Python:为什么将发电机转换为列表需要这么长时间



在为API创建一些JSON输出时,我正在使用发电机来确保转换过程可扩展,然后将其输出转换为列表,以便可以将其插入较大的JSON对象作为JSON对象的列表(this_list)。

通过创建发电机的迭代足够快 - 1-200ms 100个项目 - 但然后将发电机转换为列表大约需要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:一个合理的词典)。

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

是否有一种既可以扩展又快速的替代策略?

编辑

响应评论,我在原始帖子中添加了其他信息。

您不是在上述代码中"迭代"(在创建列表时本质上除外),因此,除非您单独进行此操作,否则您没有基准测试。您的发电机表达式

(do_some_processing_to_each_item(item) for item in dataset)

Just 创建一个生成器;在调用these_items.__next__()之前,该处理不会发生(因为在these_items上循环时,每个项目都是。

要排除列表创建/存储为瓶颈,您只需时间:

for item in these_items:
    do_some_processing_to_each_item(item)

为什么不直接使用列表构图,类似:

return [do_some_processing_to_each_item(item) for item in dataset]

最新更新