为什么在PyPy中根据用户输入构建列表并打印其内容比CPython要慢得多?

时间:2019-06-28 17:34:22

标签: python cpython pypy

我正在为CodeForces中的问题进行编码,然后我submitted将此代码在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秒。

由CPython解释器运行时,相同的代码ran in under 600 ms

据我了解,PyPy通常比Python快。为什么CPython对于此代码会更快?

1 个答案:

答案 0 :(得分:1)

欢迎堆栈溢出!用两个词来说,在这种情况下PyPy对CPython松散的原因是我们正在运行的Python代码实际上并没有太多的计算,而是将所有的时间都花在了输入/输出上(首先是循环input() ,然后循环print())。这可能是花费时间的主要部分。 PyPy的输入/输出例程没有CPython的优化,这就是为什么它慢一些的原因。您可能会猜测,当您编写的Python代码花时间在Python中进行计算时,PyPy会胜过CPython,有时会大获成功。

“在Python中执行计算”的反义词有时被称为“运行库代码”,这包括诸如输入/输出之类的东西,或更普遍地讲,其中单个Python函数调用会调用大量C代码的事物。请注意,与直觉相反,这还包括对非常大的整数进行算术运算,因为对于每个单个操作都需要大量C代码。相反的极端示例是对最多sys.maxsize的“小”整数进行算术运算,因为PyPy JIT可以将每个操作直接映射到一条CPU指令。

总而言之,在纯Python中花费一些时间的PyPy很好-不一定是所有时间。例如,非平凡的纯Python Web服务器往往会从PyPy中受益匪浅:原始套接字的输入/输出确实要慢一些,但是处理查询和建立响应的所有逻辑都快得多,这很容易执行时间的主要部分。