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

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

Сообщение Anonymous »

Я проводил рефакторинг кода для хранения большой коллекции идентификаторов строк в наборе, а не в списке, ожидая, что это будет более эффективно.
Я использую Any(), чтобы проверить, существует ли определенная строка в коллекции.
Моя интуиция была такой: «Если элемент присутствует, обе версии должны найти его быстро и закоротить».
Однако результаты тестов совершенно неожиданны.
Код:

Код: Выделить всё

import timeit
import sys

# 10 million items
# Putting the "target" right at the front of the list
large_list = ["target"] + [str(i) for i in range(10_000_000)]
large_set = set(large_list)

def test_list():
# This should be instant because "target" is at the start
return any(x == "target" for x in large_list)

def test_set():
# This should also be fast since the item is in the set... right?
return any(x == "target" for x in large_set)

print(f"Python version: {sys.version}")

# Benchmark (100 runs)
print(f"List time: {timeit.timeit(test_list, number=100):.5f}s")
print(f"Set time: {timeit.timeit(test_set, number=100):.5f}s"))
Результаты (Python 3.13.12/Windows):

Код: Выделить всё

List time: 0.00006s
Set time: 117.42934s
Почему методу Any() требуется так много времени, чтобы «найти» элемент в наборе, хотя я знаю, что этот элемент там есть?
Ответить

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

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

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

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

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