【问题标题】:Why is building a list from user input and printing its contents much slower in PyPy than CPython?为什么在 PyPy 中从用户输入构建列表并打印其内容比 CPython 慢得多?
【发布时间】:2019-06-28 17:34:22
【问题描述】:

我正在为 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 对于这段代码会更快?

【问题讨论】:

  • PyPy 是python,你是说PyPy vs CPython?
  • @juanpa.arrivillaga 是的,这就是我的意思。我对 Python 比较陌生。不过谢谢。我编辑了我的帖子。
  • 许多 SO 读者可能不知道您的缩写是什么意思。我假设他们通常来自 Code Forces 社区。​​span>
  • 鉴于您收到的答案,我认为回顾这个具体案例是有启发性和有用的。为了将问题纳入主题指南,我已对其进行了修改,以具体说明这段代码的情况,而不是寻求一般性建议并直接包含代码。请检查我所写的错误,并注意您的代码在此处包含您的代码意味着它已获得知识共享许可。如果您可以接受,请通知我,我将提名该问题以重新开放。如果没有,我很抱歉假设许可。
  • @jpmc26 感谢您编辑我的帖子!在这里包括我的代码对我来说绝对没问题。当我发布下一个问题时,我会记住这些要点。谢谢

标签: python cpython pypy


【解决方案1】:

欢迎来到堆栈溢出!简而言之,在这种情况下,PyPy 输给 CPython 的原因是我们正在运行的 Python 代码并没有真正计算太多,而是所有时间都花在了输入/输出上(首先是 input() 的循环,然后print() 的循环)。这可能是花费时间的主要部分。 PyPy 的输入/输出例程不如 CPython 的优化,这就是它有点慢的原因。当您编写的 Python 代码花时间在 Python 中进行计算时,您可能会猜测 PyPy 会战胜 CPython,有时是大规模的。

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

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

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2011-06-27
    • 2014-11-07
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多