Хотя объединение чисел (x * 10 ** 5 + y) дает лучшую производительность, отладку проблем в вашем наборе может быть сложнее.Альтернатива, которая быстрее, чем наборы кортежей, но немного медленнее, чем числовые комбинации, заключалась бы в использовании словаря наборов:
def f3():
seen = dict()
for x in range(1000):
for y in range(1000):
seen.setdefault(x,set()).add(y) # insert a new pair
assert x in seen and y in seen[x] # check if pair in dictionary
Эта функция f3 () умножается на 0,284 с против f2 () на 0,248 (такне огромная потеря производительности).Это также дает вам дополнительное преимущество, заключающееся в возможности простого перечисления значений y для любого заданного значения x.
EDIT
Использование defaultdict действительно ускоряет его.Это даже быстрее, чем числовые комбинации (0,126) и в 4 раза быстрее, чем набор кортежей.
from collections import defaultdict
def f4():
seen = defaultdict(set)
for x in range(1000):
for y in range(1000):
seen[x].add(y) # insert a new pair
assert y in seen[x] # check if pair in dictionary