Я сравниваю производительность метода Any() при использовании в списке и в наборе для поиска известного элемента. Мое первоначальное предположение заключалось в том, что, поскольку Any() имеет короткое замыкание, производительность будет сопоставимой, но мои тесты показывают, что набор постоянно работает намного медленнее.
Код:
Код: Выделить всё
import timeit
large_list = ["target"] + [str(i) for i in range(10_000_000)]
large_set = set(large_list)
# Benchmarking
list_time = timeit.timeit(lambda: any(x == "target" for x in large_list), number=10)
set_time = timeit.timeit(lambda: any(x == "target" for x in large_set), number=10)
print(f"List: {list_time}")
print(f"Set: {set_time}")
Я знаю, что элемент в big_set равен O(1) и является «правильным» способом проверки членства.
Я понимаю, что Any() вызывает линейное сканирование, что делает его O(n) для обеих структур.
Вопрос:
Что конкретно влияет на производительность разрыв при итерации? Это связано с расположением внутренней памяти хеш-таблицы (погоня за указателем) по сравнению с непрерывной памятью списка, или в реализации итератора набора есть определенные накладные расходы?
Мобильная версия