Python 哪一个对标准输入更有效

Python 哪一个对标准输入更有效,python,Python,我正在尝试从标准输入 我认为有很多方法可以做到这一点。 其中,我想使用以下两种方法之一。 (如果有更有效的替代方案,请告诉我) 首先, line = sys.stdin.readline() while line != "" : # do something line = sys.stdin.readline() 第二, for line in stdin : # do something 哪种方法更有效? 若并没有区别,那个么哪一个更接近标准 对不起,我的英语很差

我正在尝试从标准输入

我认为有很多方法可以做到这一点。 其中,我想使用以下两种方法之一。 (如果有更有效的替代方案,请告诉我)

首先,

line = sys.stdin.readline()
while line != "" :
    # do something
    line = sys.stdin.readline()
第二,

for line in stdin :
    # do something
哪种方法更有效? 若并没有区别,那个么哪一个更接近标准

对不起,我的英语很差

我期待着您的回答。

第二个(
用于sys.stdin中的line
)更高效、更干燥、更具Pythonic。

您可以使用iter:

from sys import stdin

for line in iter(stdin.readline, "\n"):
    # do something
    print(line)
或使用原始输入:

for line in iter(raw_input, ""): # python3 -> for line in iter(input, ""):
    # do something
    print(line)
使用
while line!=“”


我会使用原始输入或输入,如果您实际使用用户输入,我也怀疑效率是否会成为您选择的问题。

stdin中第二行的
效率更高,因为它只需要做更少的工作

定量查看性能的一种方法是查看字节码:

In [1]: def a():
   ...:     line = sys.stdin.readline()
   ...:     while line != "":
   ...:         line = sys.stdin.readline()
   ...:

In [2]: def b():
   ...:     for line in stdin:
   ...:         pass
   ...:
您可以使用该模块进行以下操作:

In [3]: import dis
这是第一个功能:

In [4]: dis.dis(a)
  2           0 LOAD_GLOBAL              0 (sys)
              3 LOAD_ATTR                1 (stdin)
              6 LOAD_ATTR                2 (readline)
              9 CALL_FUNCTION            0 (0 positional, 0 keyword pair)
             12 STORE_FAST               0 (line)

  3          15 SETUP_LOOP              31 (to 49)
        >>   18 LOAD_FAST                0 (line)
             21 LOAD_CONST               1 ('')
             24 COMPARE_OP               3 (!=)
             27 POP_JUMP_IF_FALSE       48

  4          30 LOAD_GLOBAL              0 (sys)
             33 LOAD_ATTR                1 (stdin)
             36 LOAD_ATTR                2 (readline)
             39 CALL_FUNCTION            0 (0 positional, 0 keyword pair)
             42 STORE_FAST               0 (line)
             45 JUMP_ABSOLUTE           18
        >>   48 POP_BLOCK
        >>   49 LOAD_CONST               0 (None)
             52 RETURN_VALUE
这是第二个,它有大约50%的说明:

In [5]: dis.dis(b)
  2           0 SETUP_LOOP              14 (to 17)
              3 LOAD_GLOBAL              0 (stdin)
              6 GET_ITER
        >>    7 FOR_ITER                 6 (to 16)
             10 STORE_FAST               0 (line)

  3          13 JUMP_ABSOLUTE            7
        >>   16 POP_BLOCK
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE

In [6]:
请注意,第一个需要进行属性查找,
LOAD\u ATTR
,以及函数调用,
call\u function
,这些都是昂贵的,并且在第二个字节码摘录中不存在

In [5]: dis.dis(b)
  2           0 SETUP_LOOP              14 (to 17)
              3 LOAD_GLOBAL              0 (stdin)
              6 GET_ITER
        >>    7 FOR_ITER                 6 (to 16)
             10 STORE_FAST               0 (line)

  3          13 JUMP_ABSOLUTE            7
        >>   16 POP_BLOCK
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE

In [6]: