Python 3.11 против Python 3.12 – тестирование производительности

В этой статье описаны результаты тестирования производительности Python 3.12 по сравнению с Python 3.11. Всего был проведен 91 различный тест производительности на компьютерах с процессорами AMD Ryzen 7000-й серии и процессорами Intel Core 13-го поколения для настольных ПК, ноутбуков или мини-ПК.

Все тесты проводились на компьютерах с Windows 11 с использованием библиотеки pyperformance 1.0.9 в Python 3.11.6 и Python 3.12.0 (обе 64-разрядные версии).

AMD Ryzen 7000-й серии для настольных ПК

В первой части тестирования участвовал настольный компьютер с процессором AMD Ryzen 9 7900, оперативной памятью DDR5 и накопителем M.2 PCIe Gen4 NVMe. В таблице ниже показаны результаты 91 теста, выполненного с использованием Python 3.11 (в качестве эталона) и Python 3.12 на этом устройстве.

Название теста Python 3.11 Python 3.12
2to3 191 мс 202 мс (1.06x медленнее)
async_generators 198 мс 268 мс (1.35x медленнее)
async_tree_cpu_io_mixed 580 мс 516 мс (1.12x быстрее)
async_tree_cpu_io_mixed_tg 521 мс 512 мс (1.02x быстрее)
async_tree_io 949 мс 864 мс (1.10x быстрее)
async_tree_io_tg 930 мс 892 мс (1.04x быстрее)
async_tree_memoization 420 мс 386 мс (1.09x быстрее)
async_tree_memoization_tg 394 мс 378 мс (1.04x быстрее)
async_tree_none 340 мс 316 мс (1.07x быстрее)
async_tree_none_tg 300 мс 292 мс (1.03x быстрее)
asyncio_tcp 708 мс 476 мс (1.49x быстрее)
asyncio_tcp_ssl 2.02 с 1.90 с (1.07x быстрее)
bench_mp_pool 54.9 мс 63.8 мс (1.16x медленнее)
bench_thread_pool 687 мкс 694 мкс (1.01x медленнее)
chameleon 5.23 мс 5.25 мс (незначительно)
chaos 45.7 мс 45.5 мс (незначительно)
comprehensions 14.4 мкс 14.3 мкс (незначительно)
coroutines 16.9 мс 16.9 мс (незначительно)
coverage 141 мс 239 мс (1.69x медленнее)
create_gc_cycles 521 мкс 537 мкс (1.03x медленнее)
crypto_pyaes 48.3 мс 49.6 мс (1.03x медленнее)
dask 235 мс 241 мс (1.03x медленнее)
deepcopy 225 мкс 229 мкс (1.02x медленнее)
deepcopy_memo 25.1 мкс 26.1 мкс (1.04x медленнее)
deepcopy_reduce 2.02 мкс 2.11 мкс (1.05x медленнее)
deltablue 2.63 мс 2.48 мс (1.06x быстрее)
django_template 23.0 мс 23.4 мс (1.02x медленнее)
docutils 1.39 с 1.46 с (1.05x медленнее)
fannkuch 240 мс 254 мс (1.06x медленнее)
float 53.5 мс 59.6 мс (1.11x медленнее)
gc_traversal 1.25 мс 1.26 мс (1.01x медленнее)
generators 41.0 мс 26.6 мс (1.55x быстрее)
genshi_text 16.6 мс 16.2 мс (1.03x быстрее)
genshi_xml 95.9 мс 97.9 мс (1.03x быстрее)
hexiom 4.39 мс 4.57 мс (1.04x медленнее)
html5lib 31.2 мс 33.3 мс (1.07x медленнее)
json_dumps 7.72 мс 5.77 мс (1.34x быстрее)
json_loads 12.7 мкс 13.5 мкс (1.06x медленнее)
logging_format 6.35 мкс 6.62 мкс (1.04x медленнее)
logging_silent 71.6 нс 70.5 нс (1.02x быстрее)
logging_simple 6.00 мкс 6.24 мкс (1.04x медленнее)
mako 7.49 мс 7.76 мс (1.04x медленнее)
mdp 1.62 с 1.62 с (незначительно)
meteor_contest 65.9 мс 67.4 мс (1.02x медленнее)
nbody 73.6 мс 87.0 мс (1.18x медленнее)
nqueens 60.3 мс 61.7 мс (1.02x медленнее)
pathlib 79.9 мс 91.9 мс (1.15x медленнее)
pickle 6.66 мкс 7.11 мкс (1.07x медленнее)
pickle_dict 18.3 мкс 18.9 мкс (1.03x медленнее)
pickle_list 2.59 мкс 2.73 мкс (1.05x медленнее)
pickle_pure_python 191 мкс 198 мкс (1.03x медленнее)
pidigits 136 мс 138 мс (1.02x медленнее)
pprint_pformat 983 мс 1.03 с (1.04x медленнее)
pprint_safe_repr 479 мс 506 мс (1.06x медленнее)
pyflate 293 мс 315 мс (1.07x медленнее)
python_startup 15.2 мс 15.6 мс (1.02x медленнее)
python_startup_no_site 12.5 мс 13.1 мс (1.04x медленнее)
raytrace 204 мс 210 мс (1.03x медленнее)
regex_compile 77.1 мс 83.1 мс (1.08x медленнее)
regex_dna 103 мс 103 мс (незначительно)
regex_effbot 1.64 мс 1.74 мс (1.06x медленнее)
regex_v8 14.7 мс 14.4 мс (1.03x быстрее)
richards 29.8 мс 31.2 мс (1.05x медленнее)
richards_super 37.0 мс 34.6 мс (1.07x быстрее)
scimark_fft 214 мс 220 мс (1.03x медленнее)
scimark_lu 68.7 мс 75.3 мс (1.10x медленнее)
scimark_monte_carlo 44.2 мс 48.3 мс (1.09x медленнее)
scimark_sor 80.4 мс 91.7 мс (1.14x медленнее)
scimark_sparse_mat_mult 3.29 мс 3.32 мс (незначительно)
spectral_norm 75.7 мс 84.7 мс (1.12x медленнее)
sqlglot_normalize 178 мс 186 мс (1.04x медленнее)
sqlglot_optimize 32.3 мс 33.9 мс (1.05x медленнее)
sqlglot_parse 891 мкс 861 мкс (1.04x быстрее)
sqlglot_transpile 1.06 мс 1.05 мс (незначительно)
sqlite_synth 1.41 мкс 1.49 мкс (1.06x медленнее)
sympy_expand 248 мс 247 мс (1.00x быстрее)
sympy_integrate 11.8 мс 11.8 мс (незначительно)
sympy_str 152 мс 154 мс (1.01x медленнее)
sympy_sum 86.4 мс 83.3 мс (1.04x быстрее)
telco 3.91 мс 4.26 мс (1.09x медленнее)
tomli_loads 1.46 с 1.53 с (1.04x медленнее)
tornado_http 86.9 мс 86.2 мс (1.01x быстрее)
typing_runtime_protocols 307 мкс 102 мкс (2.99x быстрее)
unpack_sequence 35.1 нс 53.4 нс (1.52x медленнее)
unpickle 8.13 мкс 8.54 мкс (1.05x медленнее)
unpickle_list 2.86 мкс 2.80 мкс (1.02x быстрее)
unpickle_pure_python 150 мкс 149 мкс (1.01x быстрее)
xml_etree_generate 53.6 мс 60.4 мс (1.13x медленнее)
xml_etree_iterparse 60.0 мс 59.1 мс (1.02x быстрее)
xml_etree_parse 82.3 мс 78.4 мс (1.05x быстрее)
xml_etree_process 38.4 мс 42.3 мс (1.10x медленнее)
Результат (среднее геометрическое) 1.01x медленнее

Анализ измерений показывает, что Python 3.12 имеет лучшие результаты по производительности по сравнению с Python 3.11 в следующих тестах: typing_runtime_protocols (2.99x быстрее), generators (1.55x быстрее), asyncio_tcp (1.49x быстрее). Однако можно заметить падение производительности в некоторых тестах, особенно в coverage (1.69x медленнее), unpack_sequence (1.52x медленнее), async_generators (1.35x медленнее).

Кроме того, можно обнаружить различия в производительности между Python 3.12 и Python 3.11 на основе тестов, принадлежащих определенным группам. В таблице ниже показано среднее геометрическое для тестов из отдельных групп для Python 3.12 по сравнению с Python 3.11.

Группа тестов Python 3.12 по сравнению с Python 3.11
apps 1.03x медленнее
asyncio 1.06x быстрее
math 1.10x медленнее
regex 1.03x медленнее
serialize 1.01x медленнее
startup 1.03x медленнее
template 1.00x быстрее

Процессор Intel Core 13-го поколения для мобильных ПК

Во второй части тестирования участвовал мини-ПК с процессором Intel Core i3-1315U (который также используется в ноутбуках), оперативной памятью DDR4 и накопителем M.2 PCIe Gen4 NVMe. В таблице ниже показаны результаты 91 теста, выполненного с использованием Python 3.11 (в качестве эталона) и Python 3.12 на этом устройстве.

Название теста Python 3.11 Python 3.12
2to3 250 мс 256 мс (1.03x медленнее)
async_generators 208 мс 269 мс (1.29x медленнее)
async_tree_cpu_io_mixed 615 мс 558 мс (1.10x быстрее)
async_tree_cpu_io_mixed_tg 566 мс 562 мс (незначительно)
async_tree_io 864 мс 793 мс (1.09x быстрее)
async_tree_io_tg 859 мс 805 мс (1.07x быстрее)
async_tree_memoization 463 мс 404 мс (1.15x быстрее)
async_tree_memoization_tg 432 мс 415 мс (1.04x быстрее)
async_tree_none 373 мс 334 мс (1.12x быстрее)
async_tree_none_tg 340 мс 322 мс (1.06x быстрее)
asyncio_tcp 966 мс 707 мс (1.37x быстрее)
asyncio_tcp_ssl 3.22 с 2.24 с (1.44x быстрее)
bench_mp_pool 87.2 мс 96.7 мс (1.11x медленнее)
bench_thread_pool 1.13 мс 1.18 мс (незначительно)
chameleon 6.01 мс 5.87 мс (1.02x быстрее)
chaos 55.7 мс 50.8 мс (1.10x быстрее)
comprehensions 18.4 мкс 16.5 мкс (1.12x быстрее)
coroutines 16.8 мс 16.3 мс (1.03x быстрее)
coverage 163 мс 267 мс (1.63x медленнее)
create_gc_cycles 799 мкс 782 мкс (1.02x быстрее)
crypto_pyaes 54.9 мс 54.2 мс (1.01x быстрее)
dask 379 мс 366 мс (1.04x быстрее)
deepcopy 282 мкс 269 мкс (1.05x быстрее)
deepcopy_memo 28.9 мкс 28.0 мкс (1.03x быстрее)
deepcopy_reduce 2.35 мкс 2.40 мкс (1.02x медленнее)
deltablue 3.02 мс 2.46 мс (1.23x быстрее)
django_template 27.6 мс 26.6 мс (1.04x быстрее)
docutils 1.86 с 1.90 с (1.02x медленнее)
fannkuch 283 мс 281 мс (1.01x быстрее)
float 62.2 мс 62.4 мс (незначительно)
gc_traversal 1.80 мс 1.85 мс (1.02x медленнее)
generators 38.2 мс 25.7 мс (1.49x быстрее)
genshi_text 19.5 мс 18.5 мс (1.06x быстрее)
genshi_xml 118 мс 103 мс (1.06x быстрее)
hexiom 5.19 мс 4.74 мс (1.10x быстрее)
html5lib 45.5 мс 43.6 мс (1.04x быстрее)
json_dumps 8.76 мс 6.54 мс (1.34x быстрее)
json_loads 16.3 мкс 15.9 мкс (1.03x быстрее)
logging_format 7.67 мкс 7.40 мкс (1.04x быстрее)
logging_silent 81.4 нс 70.5 нс (1.16x быстрее)
logging_simple 7.25 мкс 6.83 мкс (1.06x быстрее)
mako 8.19 мс 7.76 мс (1.06x быстрее)
mdp 1.93 с 1.81 с (1.07x быстрее)
meteor_contest 85.9 мс 88.9 мс (1.03x медленнее)
nbody 82.0 мс 88.4 мс (1.08x медленнее)
nqueens 73.8 мс 70.9 мс (1.04x быстрее)
pathlib 73.4 мс 99.6 мс (1.36x медленнее)
pickle 7.71 мкс 8.56 мкс (1.11x медленнее)
pickle_dict 22.0 мкс 22.4 мкс (1.02x медленнее)
pickle_list 3.23 мкс 3.38 мкс (1.05x медленнее)
pickle_pure_python 229 мкс 229 мкс (незначительно)
pidigits 169 мс 171 мс (1.01x медленнее)
pprint_pformat 1.19 с 1.23 с (1.03x медленнее)
pprint_safe_repr 581 мс 604 мс (1.04x медленнее)
pyflate 359 мс 352 мс (1.02x быстрее)
python_startup 23.1 мс 22.5 мс (1.03x быстрее)
python_startup_no_site 19.8 мс 19.4 мс (1.02x быстрее)
raytrace 233 мс 225 мс (1.03x быстрее)
regex_compile 102 мс 101 мс (1.02x быстрее)
regex_dna 136 мс 134 мс (1.01x быстрее)
regex_effbot 1.72 мс 1.81 мс (1.05x медленнее)
regex_v8 15.5 мс 16.0 мс (1.03x медленнее)
richards 35.0 мс 31.2 мс (1.12x быстрее)
richards_super 43.1 мс 35.2 мс (1.22x быстрее)
scimark_fft 212 мс 207 мс (1.02x быстрее)
scimark_lu 71.5 мс 69.9 мс (1.02x быстрее)
scimark_monte_carlo 53.3 мс 50.9 мс (1.05x быстрее)
scimark_sor 87.5 мс 94.6 мс (1.08x медленнее)
scimark_sparse_mat_mult 2.97 мс 2.89 мс (1.03x быстрее)
spectral_norm 77.2 мс 74.3 мс (1.04x быстрее)
sqlglot_normalize 219 мс 212 мс (1.03x быстрее)
sqlglot_optimize 40.6 мс 38.9 мс (1.04x быстрее)
sqlglot_parse 1.07 мс 937 мкс (1.15x быстрее)
sqlglot_transpile 1.31 мс 1.18 мс (1.11x быстрее)
sqlite_synth 1.97 мкс 2.00 мкс (1.02x медленнее)
sympy_expand 350 мс 320 мс (1.09x быстрее)
sympy_integrate 15.9 мс 14.9 мс (1.07x быстрее)
sympy_str 215 мс 199 мс (1.08x быстрее)
sympy_sum 118 мс 104 мс (1.14x быстрее)
telco 4.60 мс 4.80 мс (1.04x медленнее)
tomli_loads 1.60 с 1.59 с (незначительно)
tornado_http 116 мс 116 мс (незначительно)
typing_runtime_protocols 377 мкс 116 мкс (3.25x быстрее)
unpack_sequence 52.6 нс 48.7 нс (1.08x быстрее)
unpickle 9.04 мкс 9.69 мкс (1.07x медленнее)
unpickle_list 2.99 мкс 3.08 мкс (1.03x медленнее)
unpickle_pure_python 173 мкс 160 мкс (1.08x быстрее)
xml_etree_generate 62.2 мс 66.0 мс (1.06x медленнее)
xml_etree_iterparse 75.5 мс 72.4 мс (1.04x быстрее)
xml_etree_parse 116 мс 104 мс (1.11x быстрее)
xml_etree_process 42.7 мс 45.1 мс (1.06x медленнее)
Результат (среднее геометрическое) 1.05x быстрее

Анализ измерений показывает, что Python 3.12 имеет лучшие результаты по производительности по сравнению с Python 3.11 в следующих тестах: typing_runtime_protocols (3.25x быстрее), generators (1.49x быстрее), asyncio_tcp_ssl (1.44x быстрее). Однако можно заметить падение производительности в некоторых тестах, особенно в coverage (1.63x медленнее), pathlib (1.36x медленнее), async_generators (1.29x медленнее).

Кроме того, можно обнаружить различия в производительности между Python 3.12 и Python 3.11 на основе тестов, принадлежащих определенным группам. В таблице ниже показано среднее геометрическое для тестов из отдельных групп для Python 3.12 по сравнению с Python 3.11.

Группа тестов Python 3.12 по сравнению с Python 3.11
apps 1.00x быстрее
asyncio 1.08x быстрее
math 1.03x медленнее
regex 1.02x медленнее
serialize 1.01x быстрее
startup 1.02x быстрее
template 1.05x быстрее
Polski
English
Русский