Добро пожаловать в переполнение стека! В двух словах, причина того, что PyPy проигрывает CPython в этом случае, заключается в том, что код Python, который мы выполняем, не очень много вычисляет, а вместо этого тратит все время на ввод / вывод (сначала с циклом input()
, затем петля print()
). Это, вероятно, основная часть того, где время проводится. Процедуры PyPy для ввода / вывода не так хорошо оптимизированы, как процедуры CPython, что является причиной того, почему он несколько медленнее. Вы можете догадаться, что PyPy победит CPython, иногда массово, когда написанный вами код Python тратит время на вычисления в Python.
Противоположность «выполнению вычислений в Python» иногда называют «работающим библиотечным кодом» - это включает в себя такие вещи, как ввод / вывод или, в более общем случае, все, что при одном вызове функции Python вызывает довольно много кода на языке Си. Обратите внимание, что, по контрасту, это также включает выполнение арифметических операций с очень и очень большими целыми числами, потому что это требует много кода на C для каждой отдельной операции. Противоположным крайним примером будет выполнение арифметики над «маленькими» целыми числами, вплоть до sys.maxsize
, поскольку PyPy JIT может сопоставлять каждую операцию непосредственно одной инструкции ЦП.
Таким образом, PyPy хорош, когда есть некоторое время, проведенное в чистом Python - не обязательно все время. Например, нетривиальные веб-серверы на чистом Python имеют тенденцию извлекать большую выгоду из PyPy: ввод / вывод необработанных сокетов действительно немного медленнее, но вся логика для обработки запросов и ответов на сборку намного быстрее, и это легко большая часть времени исполнения.