哪一个对stdin输入更有效

时间:2015-05-27 18:08:47

标签: python

我想从stdin输入。

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

第一,

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

第二

for line in stdin :
    # do something

哪一个更有效率? 如果没有差异,哪一个更Pythonic或更接近标准?

抱歉我的英语不好。

我期待你的回答

3 个答案:

答案 0 :(得分:1)

第二个(for line in sys.stdin)更有效,更干,更Pythonic。

答案 1 :(得分:0)

你可以使用它:

for line in iter(raw_input, ""): # python3 -> for line in iter(input, ""):
    # do something
    print(line)

或者使用raw_input:

while line != ""

您的循环不会使用In [2]: line = stdin.readline() In [3]: while line != "" : ...: print(repr(line)) ...: line = stdin.readline() ...: '\n' '\n' '\n' '\n'

中断
<div class="slider">
    <a class="prev" href="#">prev</a>
    <ul>
       <li>Slide 1</li>
       <li>Slide 2</li>
    </ul>
    <a class="next" href="#">next</a>
</div>

<div class="slider">
    <a class="prev" href="#">prev</a>
    <ul>
       <li>Slide 1</li>
       <li>Slide 2</li>
    </ul>
    <a class="next" href="#">next</a>
</div>

如果您实际上是在接受用户输入,我会使用raw_input或输入,我也怀疑无论您选择什么,效率都会成为一个问题。

答案 2 :(得分:0)

第二个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
   ...:

您可以使用dis模块:

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,它们在第二个字节码摘录中很昂贵且不存在。