Почему создание списка из пользовательского ввода и печать его содержимого в PyPy намного медленнее, чем в CPython? - PullRequest
0 голосов
/ 28 июня 2019

Я кодировал проблему в CodeForces, и я отправил этот код для запуска в PyPy:

import math
a=[]
b=[]
t=int(input())
for i in range(t):
    n=float(input())
    a.append(math.floor(n))
    b.append(math.ceil(n))
l=0-sum(a)
i=0
while i<len(a):
    if l>0 and a[i]!=b[i]:
        print(b[i])
        l-=1
    else:
        print(a[i])
    i+=1

Однако мне был вынесен вердикт о превышении сроков, при этом исполнение заняло более 1 секунды.

Тот же код выполнялся менее чем за 600 мс при запуске интерпретатором CPython.

Из того, что я понимаю, PyPy обычно быстрее, чем Python. Почему CPython будет быстрее для этого кода?

1 Ответ

1 голос
/ 29 июня 2019

Добро пожаловать в переполнение стека! В двух словах, причина того, что PyPy проигрывает CPython в этом случае, заключается в том, что код Python, который мы выполняем, не очень много вычисляет, а вместо этого тратит все время на ввод / вывод (сначала с циклом input(), затем петля print()). Это, вероятно, основная часть того, где время проводится. Процедуры PyPy для ввода / вывода не так хорошо оптимизированы, как процедуры CPython, что является причиной того, почему он несколько медленнее. Вы можете догадаться, что PyPy победит CPython, иногда массово, когда написанный вами код Python тратит время на вычисления в Python.

Противоположность «выполнению вычислений в Python» иногда называют «работающим библиотечным кодом» - это включает в себя такие вещи, как ввод / вывод или, в более общем случае, все, что при одном вызове функции Python вызывает довольно много кода на языке Си. Обратите внимание, что, по контрасту, это также включает выполнение арифметических операций с очень и очень большими целыми числами, потому что это требует много кода на C для каждой отдельной операции. Противоположным крайним примером будет выполнение арифметики над «маленькими» целыми числами, вплоть до sys.maxsize, поскольку PyPy JIT может сопоставлять каждую операцию непосредственно одной инструкции ЦП.

Таким образом, PyPy хорош, когда есть некоторое время, проведенное в чистом Python - не обязательно все время. Например, нетривиальные веб-серверы на чистом Python имеют тенденцию извлекать большую выгоду из PyPy: ввод / вывод необработанных сокетов действительно немного медленнее, но вся логика для обработки запросов и ответов на сборку намного быстрее, и это легко большая часть времени исполнения.

...