哪一个对stdininpu更有效

2024-04-23 21:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在试着从标准输入。你知道吗

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

首先

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

其次

for line in stdin :
    # do something

哪种方法更有效? 如果没有区别的话,哪一个更符合标准?你知道吗

对不起,我的英语不好。你知道吗

我期待你的回答


Tags: 方法infor标准readlinestdinsysline
3条回答

第二个for line in 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_ATTR,以及函数调用CALL_FUNCTION,这很昂贵,并且在第二个字节码摘录中不存在。你知道吗

您可以使用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 != ""不会中断循环

In [2]: line = stdin.readline()


In [3]: while line != "" :
   ...:     print(repr(line))
   ...:     line = stdin.readline()
   ...:     
'\n'

'\n'

'\n'

'\n'

我会使用原始输入或输入,如果你真的采取用户输入,我也怀疑效率将是一个问题,无论你选择。你知道吗

第二种(for line in sys.stdin)更有效,更干燥,更具脓性。你知道吗

相关问题 更多 >