【发布时间】:2020-09-14 18:37:22
【问题描述】:
我有几个大列表。我想把它们合并成一个单一教派的名单。例如,
small_lists = [[{'value1':1}]*100000,[{'value2':2}]*100000,[{'value3':3}]*100000]
combined_list = []
for small_list in small_lists:
combined_list.extend(small_list)
有没有比上面更快的方法?
在几个答案中建议使用numpy,但对我来说似乎要慢得多。我做错什么了吗?
import time
import numpy as np
small_lists = [[{'value1':1}]*10000000,[{'value2':2}]*10000000,[{'value3':3}]*10000000]
start = time.time()
np_list = np.array(small_lists).flatten()
print("{} sec".format(time.time() - start))
print(len(np_list))
start = time.time()
combined_list = []
for small_list in small_lists:
combined_list.extend(small_list)
print("{} sec".format(time.time() - start))
print(len(combined_list))
from functools import reduce
start = time.time()
reduce_list = reduce(lambda x, y: x+y, small_lists)
print("{} sec".format(time.time() - start))
print(len(reduce_list))
numpy 的输出为 2.01335906982 秒,扩展为 0.113998889923 秒,reduce 为 0.299326896667 秒。 extend 是迄今为止最快的。
【问题讨论】:
-
查看this answer 到一个相关(几乎重复)的问题,了解一些时间。
-
numpy并没有真正针对字典数组之类的东西进行优化。如果numpy更适合整数列表而不是字典列表,我不会感到惊讶。