У меня есть этот код:
s = set([5,6,7,8])
if key in s:
return True
if key not in s:
return False
Мне кажется, что теоретически оно не должно отличаться по времени, но я могу что-то упустить под капотом.
Есть ли какая-либо причина отдавать предпочтение одному другому по времени обработки или удобочитаемости?
Возможно, это пример:
«Преждевременная оптимизация - корень всего зла»?
Краткий ответ: Нет, без разницы. Да, возможно, преждевременная оптимизация.
ОК, я выполнил этот тест:
import random
s = set([5,6,7,8])
for _ in range(5000000):
s.add(random.randint(-100000,100000000))
def test_in():
count = 0
for _ in range(50000):
if random.randint(-100000,100000000) in s:
count += 1
print(count)
def test_not_in():
count = 0
for _ in range(50000):
if random.randint(-100000,100000000) not in s:
count += 1
print(count)
Когда я рассчитываю выходы:
%timeit test_in()
10 loops, best of 3: 83.4 ms per loop
%timeit test_not_in()
10 loops, best of 3: 78.7 ms per loop
НО, эта небольшая разница, кажется, является признаком подсчета компонентов. В среднем 47500 «не входов», а только 2500 «входов». Если я изменю оба теста на прохождение, например ::1010*
def test_in():
for _ in range(50000):
if random.randint(-100000,100000000) in s:
pass
Результаты почти идентичны
%timeit test_in()
10 loops, best of 3: 77.4 ms per loop
%timeit test_not_in()
10 loops, best of 3: 78.7 ms per loop
В этом случае моя интуиция подвела меня. Я думал, что высказывание it is not in the set
могло бы добавить дополнительное время обработки. Когда я в дальнейшем расскажу о том, что делает hashmap, кажется очевидным, что это не может иметь место.