处理大量数据的标准方法就是这样。
我们假设 list_1 是“主”(没有重复),而 list_2 是可能有重复的“更新”。
iter_1 = iter( sorted(list_1) ) # Essentially SELECT...ORDER BY
iter_2 = iter( sorted(list_2) )
eof_1 = False
eof_2 = False
try:
item_1 = iter_1.next()
except StopIteration:
eof_1= True
try:
item_2 = iter_2.next()
except StopIteration:
eof_2= True
while not eof_1 and not eof_2:
if item_1 == item_2:
# do your update to create the new master list.
try:
item_2 = iter_2.next()
except StopIteration:
eof_2= True
elif item_1 < item_2:
try:
item_1 = iter_1.next()
except StopIteration:
eof_1= True
elif item_2 < item_1:
# Do your insert to create the new master list.
try:
item_2 = iter_2.next()
except StopIteration:
eof_2= True
assert eof_1 or eof_2
if eof_1:
# item_2 and the rest of list_2 are inserts.
elif eof_2:
pass
else:
raise Error("What!?!?")
是的,它涉及一种潜在的排序。如果将 list_1 写回文件系统时保持排序顺序,则可以节省大量时间。如果 list_2 可以累积在一个保持排序的结构中,那么可以节省大量时间。
对冗长感到抱歉,但您需要知道哪个迭代器引发了StopIteration
,因此您不能(简单地)将整个 while 循环包装在一个大的旧 try 块中。