Производительность на Python 3.11.1 на 30 % хуже (по сравнению с Python 3.10.9) при использовании all() и, в меньшей степени, any().
Я обнаружил, что реализации Python 3.11.1all()
иany()
на 30% медленнее и на 23% медленнее соответственно по сравнению с Python 3.10.9
Любая идея, почему это может быть так? (К сожалению, у меня нет навыков для просмотра базовой реализации кода CPython)
import timeit
from functools import partial
import platform
def find_by_keys(
keys: list[str],
table: list[dict[str, str | int]],
match_data: dict[str, str | int],
) -> dict[str, str | int] | None:
for item in table:
if all(item[k] == match_data[k] for k in keys): # 30% slower on 3.11
# if any(item[k] == match_data[k] for k in keys): # 23% slower on 3.11
# if item["id"] == match_data["id"]: # 3% faster on 3.11
return item
return None
def main():
keys: list[str] = ["id", "key_1", "key_2"]
table: list[dict[str, str | int]] = [
{
"id": i,
"key_1": "val_1",
"key_2": "val_2",
}
for i in range(1, 5001)
]
match_data: dict[str, str | int] = {
"id": 3000,
"key_1": "val_1",
"key_2": "val_2",
}
# Note: used repeat=50000 for all() calls, otherwise used repeat=500000
timeit_output = timeit.repeat(
partial(find_by_keys, keys, table, match_data),
repeat=50000,
number=1
)
average_time = sum(timeit_output) / len(timeit_output)
best_time = min(timeit_output)
tps_output = 1 / average_time
print(f"Python version = {platform.python_version()}")
print(f"Average time = {average_time}")
print(f"Best time = {best_time}")
print(f"Average transactions per second = {tps_output}")
if __name__ == "__main__":
main()
Полученные результаты
Вывод консоли с использованием Python 3.10.9:
Python version = 3.10.9
Average time = 0.0008256170657486655
Best time = 0.0007106999401003122
Average transactions per second = 1211.2152733824669
Вывод консоли с использованием Python 3.11.1:
Python version = 3.11.1
Average time = 0.0011819988898839802
Best time = 0.001033599954098463
Average transactions per second = 846.0244832363215