虽然为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:一个相当大的字典。)
为什么这最后一步花了这么长时间,是否有更快的方法将生成器的输出转换为列表?
是否存在可扩展且快速的替代策略?
编辑
在回复评论时,我在原帖中添加了其他信息。
答案 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]