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]: