2.4.5 高效合并有序序列
对于小数据集,将多个有序序列合并到一个新序列很容易。list(sorted(itertools.chain(*data)))对于较大的数据集,这个技术可能会占用大量内存。merge()不是对整个合并后的序列排序,而是使用一个堆一次一个元素地生成一个新序列,利用固定大小的内存确定下一个元素。
import heapq
import random
random.seed(2016)
data = []
for i in range(4):
new_data = list(random.sample(range(1,101),5))
new_data.sort()
data.append(new_data)
for i,d in enumerate(data):
print('{}:{}'.format(i,d))
print('\nMerged:')
for i in heapq.merge(*data):
print(i,end=' ')
print()
由于merge()的实现使用了一个堆,所以它会根据所合并的序列个数消费内存,而不是根据这些序列中的元素个数。
运行结果: