Почему линейная итерация (с использованием Any()) для набора Python значительно медленнее, чем для списка?Python

Программы на Python
Ответить
Anonymous
 Почему линейная итерация (с использованием Any()) для набора Python значительно медленнее, чем для списка?

Сообщение Anonymous »

Справочная информация:
Я сравниваю производительность метода 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) для обеих структур.
Вопрос:
Что конкретно влияет на производительность разрыв при итерации? Это связано с расположением внутренней памяти хеш-таблицы (погоня за указателем) по сравнению с непрерывной памятью списка, или в реализации итератора набора есть определенные накладные расходы?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»