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