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

时间:2014-03-25 00:58:47

标签: python python-3.x

当我需要从STDIN获取输入行时,我正在尝试决定使用哪一个,所以我想知道在不同情况下我需要选择它们。

我发现上一篇文章(https://codereview.stackexchange.com/questions/23981/how-to-optimize-this-simple-python-program)说:

  

如何根据使用的时间和内存优化此代码?请注意,我使用不同的函数来读取输入,因为sys.stdin.readline()是读取字符串时最快的一个,而读取整数时则是input()。

该陈述是真的吗?

3 个答案:

答案 0 :(得分:12)

内置inputsys.stdin.readline函数并不完全相同,哪一个更快可能取决于您正在做什么的详细信息。正如aruisdante所评论的那样,Python 3中的差异小于Python 2中的差异,当你提供的引用来自,但仍然存在一些差异。

第一个区别是input有一个可选的提示参数,如果解释器以交互方式运行,将显示该参数。即使提示为空(默认值),这也会导致一些开销。另一方面,如果您确实需要提示,则可能比在每次print调用之前执行readline更快。

下一个区别是input从输入的末尾剥离任何换行符。无论如何你要剥离它,让input为你做这件事可能会更快,而不是sys.stdin.readline().strip()

最后一个区别是如何指示输入结束。如果没有更多输入(stdin已在另一端关闭),input将在您调用它时引发EOFError。另一方面,sys.stdin.readline将在EOF处返回一个空字符串,您需要知道该字符串以进行检查。

还有第三个选项,使用sys.stdin上的文件迭代协议。这可能与调用readline非常相似,但可能更好的逻辑。

我怀疑虽然各种选项之间的性能差异可能存在,但它们只比简单地从磁盘读取文件(如果它很大)的时间成本小,并且做任何你正在做的事情。我建议你避免过早优化的陷阱,只做对你的问题最自然的事情,如果程序太慢(“太慢”非常主观),你做一些分析,看看什么是最有效的时间。除非确实重要,否则不要花费大量精力来决定采用不同的输入方式。

答案 1 :(得分:0)

每次在input()由syscall运行时,它都会检查是否为TTY,它的运行速度比sys.stdin.readline()慢得多 https://github.com/python/cpython/blob/af2f5b1723b95e45e1f15b5bd52102b7de560f7c/Python/bltinmodule.c#L1981

答案 2 :(得分:0)

正如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

请注意,尽管它仍然非常快,所以当您阅读上面成千上万的条目时,您只需要担心。