В Objects / setobject.c в исходном коде CPython есть функция set_or
, которую Python использует для |
под капотом.
Для тех, кто не умеет читать C, исходный код можно обобщить следующим образом:
def is_any_set(o: object) -> bool:
return isinstance(o, (set, frozenset))
def set_or(so: set, other: set) -> set:
if not is_any_set(so) or not is_any_set(other):
return NotImplemented
result = so.copy()
if so is other:
return result
result.update(other)
return result
Так скажем n = len(so); m = len(other)
. Отсюда видно, что это комбинация set.copy
, равная O(n)
, и set.update
, равная O(m)
(линейная по отношению ко второму набору). Таким образом, время для всей операции составляет O(n + m)
, что является линейным, в зависимости от размера обоих наборов.
(Обратите внимание, что это зависит от hash(o)
, являющегося постоянным.)