sys.stdin.readline()和input():哪个在读取输入行时更快,为什么?

21 投票
4 回答
32873 浏览
提问于 2025-04-17 23:45

我正在考虑在需要从标准输入(STDIN)获取输入时,应该选择哪种方法,所以我想知道在不同情况下该如何选择。

我发现了之前的一篇帖子(https://codereview.stackexchange.com/questions/23981/how-to-optimize-this-simple-python-program),里面提到:

我该如何在时间和内存使用上优化这段代码?注意,我使用了不同的函数来读取输入,因为 sys.stdin.readline() 在读取字符串时是最快的,而 input() 在读取整数时更合适。

这个说法是真的吗?

4 个回答

-2

在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如说,有人可能在使用某个工具或库的时候,遇到了错误或者不明白的地方。这时候,他们会在网上发帖求助,像是在StackOverflow这样的论坛上。

在这些帖子里,提问的人会详细描述他们遇到的问题,包括他们的代码、错误信息以及他们尝试过的解决方法。其他人看到这些帖子后,会根据自己的经验和知识,给出建议或者解决方案。

总之,这种互动方式帮助了很多人解决了编程中的难题,也让大家在学习的过程中互相帮助,共同进步。

import sys

def solve(N, A):
    for in range (N):
        A.append(int(sys.stdin.readline().strip()))
    return A

def main():
    N = int(sys.stdin.readline().strip())
    A = []
    result = solve(N, A):
    print(result)

main()
4

每次调用input()时,它都会检查是否是TTY(终端设备),这个过程是通过系统调用来完成的,所以比使用sys.stdin.readline()要慢得多。

8

正如Linn1024所说,当你需要读取大量数据时,使用input()会慢很多。

这里有个简单的例子:

import sys
for i in range(int(sys.argv[1])):
    sys.stdin.readline()

这个每次迭代大约需要0.25μs

$ time yes | py readline.py 1000000
yes  0.05s user 0.00s system 22% cpu 0.252 total

如果把它改成sys.stdin.readline().strip(),那么每次迭代大约需要0.31μs

而如果把readline()换成input(),速度会慢大约10倍:

$ time yes | py input.py 1000000
yes  0.05s user 0.00s system 1% cpu 2.855 total

不过要注意,虽然速度变慢,但其实还是挺快的。所以你只需要在读取上千条数据的时候,才需要特别关注这个问题。

30

内置的 inputsys.stdin.readline 函数并不是完全一样的,它们的速度快慢可能还得看你具体在做什么。正如 aruisdante 评论的那样,这两者在 Python 3 中的差别比在 Python 2 中小,但还是有一些不同之处。

第一个区别是 input 有一个可选的提示参数,如果你在交互模式下运行解释器,这个提示会显示出来。即使提示是空的(默认情况),这也会增加一些开销。另一方面,如果你确实需要提示,使用 input 可能比在每次调用 readline 之前先做一次 print 更快。

下一个区别是 input 会自动去掉输入末尾的换行符。如果你本来就打算去掉这个换行符,使用 input 可能会更快,而不是用 sys.stdin.readline().strip()

最后一个区别是输入结束的指示方式。当没有更多输入时(也就是 stdin 在另一端被关闭),调用 input 会抛出一个 EOFError 错误。而 sys.stdin.readline 在输入结束时会返回一个空字符串,你需要自己去检查这个空字符串。

还有第三种选择,就是使用 sys.stdin 的文件迭代协议。这可能和调用 readline 很相似,但逻辑上可能会更好一些。

我怀疑虽然你选择的不同方式在性能上可能会有差异,但这些差异可能比从磁盘读取大文件的时间成本要小得多。如果你的程序运行得太慢(“太慢”这个标准是很主观的),我建议你先做一些性能分析,看看哪些部分耗时最多。不要过于纠结于选择不同的输入方式,除非这真的很重要。

撰写回答