我已經寫了一些代碼來查找所有項目在一個迭代中,而不是另一個,反之亦然。我最初使用的是內置集合差異,但由於每組中有數百萬個項目存儲,所以計算速度相當慢。因爲我知道會有最多幾千元的差異我寫了下面的版本:pythonic可迭代的差異
def differences(a_iter, b_iter):
a_items, b_items = set(), set()
def remove_or_add_if_none(a_item, b_item, a_set, b_set):
if a_item is None:
if b_item in a_set:
a_set.remove(b_item)
else:
b_set.add(b)
def remove_or_add(a_item, b_item, a_set, b_set):
if a in b_set:
b_set.remove(a)
if b in a_set:
a_set.remove(b)
else:
b_set.add(b)
return True
return False
for a, b in itertools.izip_longest(a_iter, b_iter):
if a is None or b is None:
remove_or_add_if_none(a, b, a_items, b_items)
remove_or_add_if_none(b, a, b_items, a_items)
continue
if a != b:
if remove_or_add(a, b, a_items, b_items) or \
remove_or_add(b, a, b_items, a_items):
continue
a_items.add(a)
b_items.add(b)
return a_items, b_items
然而,上面的代碼似乎並不十分Python的,所以我正在尋找替代品或改進建議。
你的速度比內置設置差距快多少? –