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

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

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

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

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

Название теста Python 3.9 Python 3.10
2to3 217 мс 216 мс (незначительно)
async_generators 221 мс 230 мс (1.04x медленнее)
async_tree_cpu_io_mixed 682 мс 685 мс (незначительно)
async_tree_io 1.33 с 1.32 с (незначительно)
async_tree_memoization 559 мс 560 мс (незначительно)
async_tree_none 479 мс 471 мс (незначительно)
asyncio_tcp 619 мс 686 мс (1.11x медленнее)
asyncio_tcp_ssl 1.76 с 2.04 с (1.16x медленнее)
bench_mp_pool 56.7 мс 55.4 мс (1.02x быстрее)
bench_thread_pool 706 мкс 725 мкс (1.03x медленнее)
chameleon 6.03 мс 5.89 мс (1.02x быстрее)
chaos 57.6 мс 57.1 мс (1.01x быстрее)
comprehensions 14.5 мкс 14.6 мкс (незначительно)
coroutines 21.4 мс 17.3 мс (1.24x быстрее)
coverage 25.5 мс 33.5 мс (1.31x медленнее)
create_gc_cycles 635 мкс 637 мкс (1.00x медленнее)
crypto_pyaes 61.8 мс 62.7 мс (1.01x медленнее)
dask 269 мс 263 мс (1.02x быстрее)
deepcopy 245 мкс 253 мкс (1.03x медленнее)
deepcopy_memo 28.3 мкс 28.9 мкс (1.02x медленнее)
deepcopy_reduce 2.19 мкс 2.20 мкс (незначительно)
deltablue 4.00 мс 4.27 мс (1.07x медленнее)
django_template 28.4 мс 28.2 мс (1.01x быстрее)
docutils 1.57 с 1.63 с (1.04x медленнее)
fannkuch 263 мс 256 мс (незначительно)
float 66.6 мс 66.7 мс (незначительно)
gc_traversal 1.20 мс 1.20 мс (незначительно)
generators 32.8 мс 41.8 мс (1.27x медленнее)
genshi_text 19.1 мс 18.7 мс (1.02x быстрее)
genshi_xml 140 мс 132 мс (незначительно)
hexiom 5.26 мс 5.46 мс (1.04x медленнее)
html5lib 41.6 мс 39.3 мс (1.06x быстрее)
json_dumps 8.28 мс 8.09 мс (1.02x быстрее)
json_loads 14.0 мкс 13.3 мкс (1.05x быстрее)
logging_format 6.22 мкс 6.74 мкс (1.08x медленнее)
logging_silent 104 нс 102 нс (незначительно)
logging_simple 5.78 мкс 6.36 мкс (1.10x медленнее)
mako 9.41 мс 9.04 мс (1.04x быстрее)
mdp 1.77 с 1.68 с (1.05x быстрее)
meteor_contest 63.7 мс 65.9 мс (1.04x медленнее)
nbody 80.7 мс 81.8 мс (1.01x медленнее)
nqueens 57.7 мс 61.3 мс (1.06x медленнее)
pathlib 80.5 мс 81.3 мс (1.01x медленнее)
pickle 6.98 мкс 6.86 мкс (1.02x быстрее)
pickle_dict 17.9 мкс 18.5 мкс (1.03x медленнее)
pickle_list 2.49 мкс 2.58 мкс (1.04x медленнее)
pickle_pure_python 250 мкс 258 мкс (1.03x медленнее)
pidigits 139 мс 136 мс (1.02x быстрее)
pprint_pformat 900 мс 1.17 с (1.30x медленнее)
pyflate 394 мс 387 мс (1.02x быстрее)
python_startup 17.7 мс 17.4 мс (1.01x быстрее)
python_startup_no_site 13.2 мс 13.2 мс (незначительно)
raytrace 267 мс 275 мс (1.03x медленнее)
regex_compile 86.8 мс 89.5 мс (1.03x медленнее)
regex_dna 106 мс 111 мс (1.04x медленнее)
regex_effbot 1.81 мс 1.78 мс (1.01x быстрее)
regex_v8 14.9 мс 15.0 мс (1.01x медленнее)
richards 38.0 мс 41.7 мс (1.10x медленнее)
richards_super 48.5 мс 50.9 мс (1.05x медленнее)
scimark_fft 205 мс 223 мс (1.09x медленнее)
scimark_lu 85.4 мс 94.3 мс (1.10x медленнее)
scimark_monte_carlo 57.9 мс 58.1 мс (незначительно)
scimark_sor 105 мс 105 мс (незначительно)
scimark_sparse_mat_mult 3.04 мс 3.47 мс (1.14x медленнее)
spectral_norm 79.7 мс 82.1 мс (1.03x медленнее)
sqlalchemy_declarative 72.4 мс 78.0 мс (1.08x медленнее)
sqlalchemy_imperative 8.55 мс 8.51 мс (1.01x быстрее)
sqlglot_normalize 181 мс 198 мс (1.10x медленнее)
sqlglot_optimize 34.6 мс 37.1 мс (1.07x медленнее)
sqlglot_parse 1.20 мс 1.12 мс (1.07x быстрее)
sqlglot_transpile 1.36 мс 1.33 мс (1.03x быстрее)
sqlite_synth 1.68 мкс 1.54 мкс (1.09x быстрее)
sympy_expand 261 мс 265 мс (1.02x медленнее)
sympy_integrate 12.8 мс 12.7 мс (1.01x быстрее)
sympy_str 159 мс 162 мс (1.02x медленнее)
sympy_sum 87.4 мс 91.4 мс (1.05x медленнее)
telco 3.89 мс 3.80 мс (1.02x быстрее)
tomli_loads 1.57 с 1.69 с (1.07x медленнее)
tornado_http 101 мс 98.2 мс (1.03x быстрее)
typing_runtime_protocols 301 мкс 314 мкс (1.04x медленнее)
unpack_sequence 35.0 нс 39.3 нс (1.12x медленнее)
unpickle 7.90 мкс 8.59 мкс (1.09x медленнее)
unpickle_list 2.87 мкс 2.87 мкс (незначительно)
unpickle_pure_python 171 мкс 176 мкс (1.03x медленнее)
xml_etree_generate 53.7 мс 55.2 мс (1.03x медленнее)
xml_etree_iterparse 55.4 мс 57.6 мс (1.04x медленнее)
xml_etree_parse 84.1 мс 83.4 мс (1.01x быстрее)
xml_etree_process 42.9 мс 44.4 мс (1.04x медленнее)
Результат (среднее геометрическое) 1.02x медленнее

Анализ измерений показывает, что Python 3.10 имеет лучшие результаты по производительности по сравнению с Python 3.9 в следующих тестах: coroutines (1.24x быстрее), sqlite_synth (1.09x быстрее), sqlglot_parse (1.07x быстрее). Однако можете заметить падение производительности в некоторых тестах, особенно в coverage (1.31x медленнее), pprint_pformat (1.30x медленнее), generators (1.27x медленнее).

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

Группа тестов Python 3.10 по сравнению с Python 3.9
apps 1.01x быстрее
math 1.00x быстрее
regex 1.02x медленнее
serialize 1.02x медленнее
startup 1.01x быстрее
template 1.02x быстрее

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

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

Название теста Python 3.9 Python 3.10
2to3 281 мс 282 мс (незначительно)
async_generators 249 мс 254 мс (1.02x медленнее)
async_tree_cpu_io_mixed 708 мс 716 мс (1.01x медленнее)
async_tree_io 1.17 с 1.16 с (1.01x быстрее)
async_tree_memoization 583 мс 593 мс (1.02x медленнее)
async_tree_none 479 мс 486 мс (незначительно)
asyncio_tcp 912 мс 981 мс (1.08x медленнее)
asyncio_tcp_ssl 2.24 с 2.43 с (1.08x медленнее)
bench_mp_pool 92.4 мс 89.5 мс (1.03x быстрее)
bench_thread_pool 1.20 мс 1.24 мс (незначительно)
chameleon 6.93 мс 6.47 мс (1.07x быстрее)
chaos 69.2 мс 68.8 мс (незначительно)
comprehensions 16.3 мкс 18.4 мкс (1.13x медленнее)
coroutines 25.4 мс 18.0 мс (1.42x быстрее)
coverage 25.2 мс 33.0 мс (1.31x медленнее)
create_gc_cycles 883 мкс 888 мкс (незначительно)
crypto_pyaes 70.5 мс 70.3 мс (незначительно)
dask 436 мс 431 мс (1.01x быстрее)
deepcopy 288 мкс 293 мкс (1.02x медленнее)
deepcopy_memo 31.2 мкс 32.0 мкс (1.03x медленнее)
deepcopy_reduce 2.52 мкс 2.47 мкс (1.02x быстрее)
deltablue 4.50 мс 4.71 мс (1.05x медленнее)
django_template 34.6 мс 33.3 мс (1.04x быстрее)
docutils 2.08 с 2.19 с (1.05x медленнее)
fannkuch 289 мс 306 мс (1.06x медленнее)
float 73.1 мс 70.0 мс (1.04x быстрее)
gc_traversal 1.69 мс 1.69 мс (незначительно)
generators 34.4 мс 36.0 мс (1.05x медленнее)
genshi_text 21.1 мс 21.6 мс (1.02x медленнее)
genshi_xml 157 мс 153 мс (1.03x медленнее)
hexiom 5.86 мс 6.22 мс (1.06x медленнее)
html5lib 56.1 мс 56.0 мс (незначительно)
json_dumps 8.96 мс 9.76 мс (1.09x медленнее)
json_loads 16.5 мкс 16.0 мкс (1.03x быстрее)
logging_format 7.50 мкс 8.15 мкс (1.09x медленнее)
logging_silent 110 нс 106 нс (1.04x быстрее)
logging_simple 6.97 мкс 7.60 мкс (1.09x медленнее)
mako 10.5 мс 9.78 мс (1.07x быстрее)
mdp 1.99 с 1.96 с (1.02x быстрее)
meteor_contest 81.9 мс 83.7 мс (1.02x медленнее)
nbody 81.5 мс 80.5 мс (незначительно)
nqueens 69.8 мс 75.9 мс (1.09x медленнее)
pathlib 74.6 мс 77.5 мс (1.04x медленнее)
pickle 7.89 мкс 7.85 мкс (незначительно)
pickle_dict 20.0 мкс 20.9 мкс (1.04x медленнее)
pickle_list 3.01 мкс 3.11 мкс (1.03x медленнее)
pickle_pure_python 292 мкс 302 мкс (1.04x медленнее)
pidigits 170 мс 167 мс (1.02x быстрее)
pprint_pformat 1.05 с 1.39 с (1.33x медленнее)
pyflate 471 мс 461 мс (1.02x быстрее)
python_startup 25.1 мс 25.0 мс (незначительно)
python_startup_no_site 19.8 мс 19.4 мс (1.02x быстрее)
raytrace 301 мс 320 мс (1.06x медленнее)
regex_compile 112 мс 118 мс (1.05x медленнее)
regex_dna 147 мс 148 мс (незначительно)
regex_effbot 1.78 мс 1.88 мс (1.06x медленнее)
regex_v8 16.5 мс 17.0 мс (1.03x медленнее)
richards 41.1 мс 46.6 мс (1.13x медленнее)
richards_super 51.7 мс 58.5 мс (1.13x медленнее)
scimark_fft 211 мс 214 мс (1.01x медленнее)
scimark_lu 87.0 мс 93.7 мс (1.08x медленнее)
scimark_monte_carlo 65.7 мс 64.1 мс (1.03x быстрее)
scimark_sor 111 мс 114 мс (1.03x медленнее)
scimark_sparse_mat_mult 2.95 мс 2.97 мс (незначительно)
spectral_norm 86.0 мс 84.8 мс (1.02x быстрее)
sqlalchemy_declarative 115 мс 125 мс (1.09x медленнее)
sqlalchemy_imperative 13.3 мс 13.1 мс (1.02x быстрее)
sqlglot_normalize 207 мс 234 мс (1.13x медленнее)
sqlglot_optimize 41.0 мс 44.8 мс (1.09x медленнее)
sqlglot_parse 1.38 мс 1.40 мс (1.01x медленнее)
sqlglot_transpile 1.62 мс 1.67 мс (1.03x медленнее)
sqlite_synth 2.26 мкс 2.16 мкс (1.05x быстрее)
sympy_expand 352 мс 367 мс (1.04x медленнее)
sympy_integrate 16.7 мс 17.4 мс (1.04x медленнее)
sympy_str 212 мс 223 мс (1.05x медленнее)
sympy_sum 115 мс 124 мс (1.08x медленнее)
telco 4.38 мс 4.42 мс (1.01x медленнее)
tomli_loads 1.75 с 1.89 с (1.08x медленнее)
tornado_http 142 мс 140 мс (1.02x быстрее)
typing_runtime_protocols 361 мкс 378 мкс (1.05x медленнее)
unpack_sequence 40.9 нс 44.9 нс (1.10x медленнее)
unpickle 9.05 мкс 9.21 мкс (незначительно)
unpickle_list 2.99 мкс 3.16 мкс (1.06x медленнее)
unpickle_pure_python 199 мкс 209 мкс (1.05x медленнее)
xml_etree_generate 59.5 мс 61.8 мс (1.04x медленнее)
xml_etree_iterparse 69.7 мс 74.4 мс (1.07x медленнее)
xml_etree_parse 113 мс 114 мс (незначительно)
xml_etree_process 54.6 мс 49.5 мс (1.10x быстрее)
Результат (среднее геометрическое) 1.03x медленнее

Анализ измерений показывает, что Python 3.10 имеет лучшие результаты по производительности по сравнению с Python 3.9 в следующих тестах: coroutines (1.42x быстрее), xml_etree_process (1.10x быстрее), chameleon (1.07x быстрее). Однако можете заметить падение производительности в некоторых тестах, особенно в pprint_pformat (1.33x медленнее), coverage (1.31x медленнее), comprehensions (1.13x медленнее).

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

Группа тестов Python 3.10 по сравнению с Python 3.9
apps 1.01x быстрее
asyncio 1.01x медленнее
math 1.03x быстрее
regex 1.04x медленнее
serialize 1.03x медленнее
startup 1.01x быстрее
template 1.01x быстрее
Polski
English
Русский