В этой статье описаны результаты тестирования производительности 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 быстрее |