我想从stdin输入。
我认为有很多方法可以执行它。 其中,我想使用以下两种方式之一。 (如果有更有效的替代方案,请告诉我)
第一,
line = sys.stdin.readline()
while line != "" :
# do something
line = sys.stdin.readline()
第二
for line in stdin :
# do something
哪一个更有效率? 如果没有差异,哪一个更Pythonic或更接近标准?
抱歉我的英语不好。我期待你的回答
答案 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
,它们在第二个字节码摘录中很昂贵且不存在。