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

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

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

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

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

Название теста Python 3.8 Python 3.9
2to3 216 мс 217 мс (незначительно)
async_generators 231 мс 221 мс (1.04x быстрее)
async_tree_cpu_io_mixed 683 мс 682 мс (незначительно)
async_tree_io 1.35 с 1.33 с (1.01x быстрее)
async_tree_memoization 552 мс 559 мс (незначительно)
async_tree_none 456 мс 479 мс (1.05x медленнее)
asyncio_tcp 650 мс 619 мс (1.05x быстрее)
asyncio_tcp_ssl 1.84 с 1.76 с (1.04x быстрее)
bench_mp_pool 55.1 мс 56.7 мс (1.03x медленнее)
bench_thread_pool 727 мкс 706 мкс (1.03x быстрее)
chameleon 7.19 мс 6.03 мс (1.19x быстрее)
chaos 60.9 мс 57.6 мс (1.06x быстрее)
comprehensions 14.3 мкс 14.5 мкс (незначительно)
coroutines 21.9 мс 21.4 мс (1.02x быстрее)
coverage 25.4 мс 25.5 мс (незначительно)
create_gc_cycles 602 мкс 635 мкс (1.05x медленнее)
crypto_pyaes 65.0 мс 61.8 мс (1.05x быстрее)
dask 265 мс 269 мс (1.02x медленнее)
deepcopy 252 мкс 245 мкс (1.03x быстрее)
deepcopy_memo 29.0 мкс 28.3 мкс (1.02x быстрее)
deepcopy_reduce 2.24 мкс 2.19 мкс (1.02x быстрее)
deltablue 4.06 мс 4.00 мс (1.01x быстрее)
django_template 29.4 мс 28.4 мс (1.03x быстрее)
docutils 1.54 с 1.57 с (1.02x медленнее)
dulwich_log 43.9 мс 42.7 мс (1.03x быстрее)
fannkuch 264 мс 263 мс (незначительно)
float 67.4 мс 66.6 мс (1.01x быстрее)
gc_traversal 1.43 мс 1.20 мс (1.19x быстрее)
generators 33.5 мс 32.8 мс (1.02x быстрее)
genshi_text 18.7 мс 19.1 мс (1.02x медленнее)
genshi_xml 139 мс 140 мс (1.08x быстрее)
hexiom 5.57 мс 5.26 мс (1.06x быстрее)
html5lib 41.4 мс 41.6 мс (незначительно)
json_dumps 8.16 мс 8.28 мс (1.02x медленнее)
json_loads 15.8 мкс 14.0 мкс (1.13x быстрее)
logging_format 6.29 мкс 6.22 мкс (1.01x быстрее)
logging_silent 104 нс 104 нс (незначительно)
logging_simple 5.92 мкс 5.78 мкс (1.02x быстрее)
mako 9.58 мс 9.41 мс (1.02x быстрее)
mdp 1.64 с 1.77 с (1.08x медленнее)
meteor_contest 64.7 мс 63.7 мс (1.02x быстрее)
nbody 76.8 мс 80.7 мс (1.05x медленнее)
nqueens 60.8 мс 57.7 мс (1.05x быстрее)
pathlib 81.5 мс 80.5 мс (1.01x быстрее)
pickle 6.68 мкс 6.98 мкс (1.04x медленнее)
pickle_dict 17.9 мкс 17.9 мкс (незначительно)
pickle_list 2.57 мкс 2.49 мкс (1.03x быстрее)
pickle_pure_python 255 мкс 250 мкс (1.02x быстрее)
pidigits 136 мс 139 мс (1.02x медленнее)
pprint_pformat 902 мс 900 мс (незначительно)
pyflate 394 мс 394 мс (незначительно)
python_startup 17.8 мс 17.7 мс (1.01x быстрее)
python_startup_no_site 13.4 мс 13.2 мс (1.02x быстрее)
raytrace 272 мс 267 мс (1.02x быстрее)
regex_compile 88.5 мс 86.8 мс (1.02x быстрее)
regex_dna 116 мс 106 мс (1.09x быстрее)
regex_effbot 1.90 мс 1.81 мс (1.05x быстрее)
regex_v8 15.1 мс 14.9 мс (1.01x быстрее)
richards 38.3 мс 38.0 мс (1.01x быстрее)
richards_super 47.1 мс 48.5 мс (1.03x медленнее)
scimark_fft 212 мс 205 мс (1.03x быстрее)
scimark_lu 86.3 мс 85.4 мс (1.01x быстрее)
scimark_monte_carlo 58.1 мс 57.9 мс (незначительно)
scimark_sor 104 мс 105 мс (незначительно)
scimark_sparse_mat_mult 3.08 мс 3.04 мс (1.01x быстрее)
spectral_norm 81.9 мс 79.7 мс (1.03x быстрее)
sqlalchemy_declarative 72.5 мс 72.4 мс (незначительно)
sqlalchemy_imperative 8.39 мс 8.55 мс (1.02x медленнее)
sqlglot_normalize 185 мс 181 мс (1.02x быстрее)
sqlglot_optimize 35.0 мс 34.6 мс (1.01x быстрее)
sqlglot_parse 1.17 мс 1.20 мс (1.03x медленнее)
sqlglot_transpile 1.36 мс 1.36 мс (незначительно)
sqlite_synth 1.83 мкс 1.68 мкс (1.09x быстрее)
sympy_expand 255 мс 261 мс (1.03x медленнее)
sympy_integrate 12.3 мс 12.8 мс (1.04x медленнее)
sympy_str 155 мс 159 мс (1.02x медленнее)
sympy_sum 86.3 мс 87.4 мс (1.01x медленнее)
telco 3.62 мс 3.89 мс (1.07x медленнее)
tomli_loads 1.65 с 1.57 с (1.05x быстрее)
tornado_http 101 мс 101 мс (незначительно)
typing_runtime_protocols 316 мкс 301 мкс (1.05x быстрее)
unpack_sequence 34.3 нс 35.0 нс (1.02x медленнее)
unpickle 9.60 мкс 7.90 мкс (1.21x быстрее)
unpickle_list 2.70 мкс 2.87 мкс (1.06x медленнее)
unpickle_pure_python 175 мкс 171 мкс (1.02x быстрее)
xml_etree_generate 57.9 мс 53.7 мс (1.08x быстрее)
xml_etree_iterparse 55.3 мс 55.4 мс (незначительно)
xml_etree_parse 85.7 мс 84.1 мс (1.02x быстрее)
xml_etree_process 44.7 мс 42.9 мс (1.04x быстрее)
Результат (среднее геометрическое) 1.02x быстрее

Анализ измерений показывает, что Python 3.9 имеет лучшие результаты по производительности по сравнению с Python 3.8 в следующих тестах: unpickle (1.21x быстрее), chameleon (1.19x быстрее), gc_traversal (1.19x быстрее). Однако можете заметить падение производительности в некоторых тестах, особенно в genshi_xml (1.08x быстрее), mdp (1.08x медленнее), telco (1.07x медленнее).

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

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

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

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

Название теста Python 3.8 Python 3.9
2to3 286 мс 281 мс (1.02x быстрее)
async_generators 255 мс 249 мс (1.02x быстрее)
async_tree_cpu_io_mixed 709 мс 708 мс (незначительно)
async_tree_io 1.17 с 1.17 с (незначительно)
async_tree_memoization 574 мс 583 мс (незначительно)
async_tree_none 460 мс 479 мс (1.04x медленнее)
asyncio_tcp 944 мс 912 мс (1.04x быстрее)
asyncio_tcp_ssl 2.29 с 2.24 с (1.02x быстрее)
bench_mp_pool 87.9 мс 92.4 мс (1.05x медленнее)
bench_thread_pool 1.21 мс 1.20 мс (незначительно)
chameleon 11.6 мс 6.93 мс (1.67x быстрее)
chaos 70.1 мс 69.2 мс (1.01x быстрее)
comprehensions 17.8 мкс 16.3 мкс (1.09x быстрее)
coroutines 28.2 мс 25.4 мс (1.11x быстрее)
coverage 26.1 мс 25.2 мс (1.03x быстрее)
create_gc_cycles 861 мкс 883 мкс (1.03x медленнее)
crypto_pyaes 73.8 мс 70.5 мс (1.05x быстрее)
dask 440 мс 436 мс (незначительно)
deepcopy 296 мкс 288 мкс (1.03x быстрее)
deepcopy_memo 32.5 мкс 31.2 мкс (1.04x быстрее)
deepcopy_reduce 2.53 мкс 2.52 мкс (незначительно)
deltablue 4.49 мс 4.50 мс (незначительно)
django_template 34.1 мс 34.6 мс (незначительно)
docutils 2.03 с 2.08 с (1.02x медленнее)
dulwich_log 56.7 мс 57.7 мс (1.02x медленнее)
fannkuch 297 мс 289 мс (1.03x быстрее)
float 74.7 мс 73.1 мс (1.02x быстрее)
gc_traversal 1.74 мс 1.69 мс (1.02x быстрее)
generators 35.5 мс 34.4 мс (1.03x быстрее)
genshi_text 21.3 мс 21.1 мс (1.01x быстрее)
genshi_xml 160 мс 157 мс (1.50x быстрее)
hexiom 6.07 мс 5.86 мс (1.04x быстрее)
html5lib 55.5 мс 56.1 мс (незначительно)
json_dumps 9.12 мс 8.96 мс (1.02x быстрее)
json_loads 22.6 мкс 16.5 мкс (1.37x быстрее)
logging_format 7.35 мкс 7.50 мкс (1.02x медленнее)
logging_silent 110 нс 110 нс (незначительно)
logging_simple 6.94 мкс 6.97 мкс (незначительно)
mako 11.0 мс 10.5 мс (1.05x быстрее)
mdp 1.93 с 1.99 с (1.03x медленнее)
meteor_contest 81.6 мс 81.9 мс (незначительно)
nbody 78.6 мс 81.5 мс (1.04x медленнее)
nqueens 73.5 мс 69.8 мс (1.05x быстрее)
pathlib 75.3 мс 74.6 мс (незначительно)
pickle 7.56 мкс 7.89 мкс (1.04x медленнее)
pickle_dict 20.0 мкс 20.0 мкс (незначительно)
pickle_list 3.07 мкс 3.01 мкс (1.02x быстрее)
pickle_pure_python 295 мкс 292 мкс (1.01x быстрее)
pidigits 167 мс 170 мс (1.02x медленнее)
pprint_pformat 1.06 с 1.05 с (1.01x быстрее)
pyflate 471 мс 471 мс (незначительно)
python_startup 25.1 мс 25.1 мс (незначительно)
python_startup_no_site 19.9 мс 19.8 мс (незначительно)
raytrace 304 мс 301 мс (1.01x быстрее)
regex_compile 112 мс 112 мс (незначительно)
regex_dna 153 мс 147 мс (1.04x быстрее)
regex_effbot 1.86 мс 1.78 мс (1.04x быстрее)
regex_v8 17.1 мс 16.5 мс (1.04x быстрее)
richards 42.5 мс 41.1 мс (1.04x быстрее)
richards_super 53.2 мс 51.7 мс (1.03x быстрее)
scimark_fft 212 мс 211 мс (незначительно)
scimark_lu 88.4 мс 87.0 мс (1.02x быстрее)
scimark_monte_carlo 66.7 мс 65.7 мс (1.02x быстрее)
scimark_sor 114 мс 111 мс (1.03x быстрее)
scimark_sparse_mat_mult 2.99 мс 2.95 мс (1.01x быстрее)
spectral_norm 86.6 мс 86.0 мс (1.01x быстрее)
sqlalchemy_declarative 115 мс 115 мс (незначительно)
sqlalchemy_imperative 13.0 мс 13.3 мс (1.02x медленнее)
sqlglot_normalize 217 мс 207 мс (1.05x быстрее)
sqlglot_optimize 41.3 мс 41.0 мс (1.01x быстрее)
sqlglot_parse 1.39 мс 1.38 мс (1.01x быстрее)
sqlglot_transpile 1.64 мс 1.62 мс (1.02x быстрее)
sqlite_synth 2.35 мкс 2.26 мкс (1.04x быстрее)
sympy_expand 336 мс 352 мс (1.05x медленнее)
sympy_integrate 16.6 мс 16.7 мс (1.01x медленнее)
sympy_str 207 мс 212 мс (1.02x медленнее)
sympy_sum 116 мс 115 мс (незначительно)
telco 4.24 мс 4.38 мс (1.03x медленнее)
tomli_loads 1.78 с 1.75 с (1.02x быстрее)
tornado_http 140 мс 142 мс (1.01x медленнее)
typing_runtime_protocols 374 мкс 361 мкс (1.04x быстрее)
unpack_sequence 39.6 нс 40.9 нс (1.03x медленнее)
unpickle 10.7 мкс 9.05 мкс (1.18x быстрее)
unpickle_list 2.98 мкс 2.99 мкс (незначительно)
unpickle_pure_python 233 мкс 199 мкс (1.17x быстрее)
xml_etree_generate 73.5 мс 59.5 мс (1.24x быстрее)
xml_etree_iterparse 75.3 мс 69.7 мс (1.08x быстрее)
xml_etree_parse 122 мс 113 мс (1.08x быстрее)
xml_etree_process 57.7 мс 54.6 мс (1.06x быстрее)
Результат (среднее геометрическое) 1.03x быстрее

Анализ измерений показывает, что Python 3.9 имеет лучшие результаты по производительности по сравнению с Python 3.8 в следующих тестах: chameleon (1.67x быстрее), genshi_xml (1.50x быстрее), json_loads (1.37x быстрее). Однако можете заметить падение производительности в некоторых тестах, особенно в bench_mp_pool (1.05x медленнее), sympy_expand (1.05x медленнее), async_tree_none (1.04x медленнее).

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

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