sys.stdin.readline()和input():哪个在读取输入行时更快,为什么?
我正在考虑在需要从标准输入(STDIN)获取输入时,应该选择哪种方法,所以我想知道在不同情况下该如何选择。
我发现了之前的一篇帖子(https://codereview.stackexchange.com/questions/23981/how-to-optimize-this-simple-python-program),里面提到:
我该如何在时间和内存使用上优化这段代码?注意,我使用了不同的函数来读取输入,因为 sys.stdin.readline() 在读取字符串时是最快的,而 input() 在读取整数时更合适。
这个说法是真的吗?
4 个回答
在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如说,有人可能在使用某个工具或库的时候,遇到了错误或者不明白的地方。这时候,他们会在网上发帖求助,像是在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()
每次调用input()时,它都会检查是否是TTY(终端设备),这个过程是通过系统调用来完成的,所以比使用sys.stdin.readline()要慢得多。
正如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
不过要注意,虽然速度变慢,但其实还是挺快的。所以你只需要在读取上千条数据的时候,才需要特别关注这个问题。
内置的 input
和 sys.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
很相似,但逻辑上可能会更好一些。
我怀疑虽然你选择的不同方式在性能上可能会有差异,但这些差异可能比从磁盘读取大文件的时间成本要小得多。如果你的程序运行得太慢(“太慢”这个标准是很主观的),我建议你先做一些性能分析,看看哪些部分耗时最多。不要过于纠结于选择不同的输入方式,除非这真的很重要。