QzT*_*one 12 python python-3.x
当我需要从STDIN获取输入行时,我正在尝试决定使用哪一个,所以我想知道在不同情况下我需要如何选择它们.
我发现之前的帖子(https://codereview.stackexchange.com/questions/23981/how-to-optimize-this-simple-python-program)说:
如何在使用的时间和内存方面优化此代码?请注意,我使用不同的函数来读取输入,因为sys.stdin.readline()是读取字符串时读取字符串和输入()时读取整数最快的函数.
那句话是真的吗?
Blc*_*ght 18
内置函数input和sys.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,但也许更好的逻辑.
我怀疑虽然各种选项之间的性能差异可能存在,但它们比简单地从磁盘读取文件的时间成本(如果它很大)并且做任何你正在做的事情都要小.我建议你避免过早优化的陷阱,只做对你的问题最自然的事情,如果程序太慢("太慢"非常主观),你做一些分析,看看什么是最有效的时间.除非确实重要,否则不要花费大量精力来决定采用不同的输入方式.
正如 Linn1024 所说,用于读取大量数据input()要慢得多。\n一个简单的例子是这样的:
import sys\nfor i in range(int(sys.argv[1])):\n sys.stdin.readline()\nRun Code Online (Sandbox Code Playgroud)\n\n这大约需要0.25\xce\xbcs每次迭代
$ time yes | py readline.py 1000000\nyes 0.05s user 0.00s system 22% cpu 0.252 total\nRun Code Online (Sandbox Code Playgroud)\n\n将其更改sys.stdin.readline().strip()为约0.31\xce\xbcs。
更改readline()为input()大约慢 10 倍:
$ time yes | py input.py 1000000\nyes 0.05s user 0.00s system 1% cpu 2.855 total\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,它仍然相当快,所以当您阅读上面的数千个条目时,您才真正需要担心。
\n