有没有更快的方式在python中获取输入?

pyr*_*nic 5 python performance input

在编码比赛中我们遇到如下输入:

2 3

4 5
Run Code Online (Sandbox Code Playgroud)

所以我们做了以下事情:

m, n = [int(x) for x in raw_input().split(' ')]
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法做同样的事情?

mgi*_*son 8

出于所有实际目的,这是尽可能快的.在某些机器上,您可能会看到订单上的加速或者如果您使用map而不是列表理解,则会看到几个百分比,但这并不能保证.

这是我机器上的一些快速计时:

from itertools import imap
#map
>>> timeit.timeit('x,y = map(int,line.split(" "))','from __main__ import line')
4.7857139110565186
>>> timeit.timeit('x,y = map(int,line.split())','from __main__ import line')
4.5680718421936035
#list comprehension
>>> timeit.timeit('x,y = [int(x) for x in line.split(" ")]','from __main__ import line')
4.3816750049591064
>>> timeit.timeit('x,y = [int(x) for x in line.split()]','from __main__ import line')
4.3246541023254395
#itertools.imap
>>> timeit.timeit('x,y = imap(int,line.split(" "))','from __main__ import line,imap')
4.431504011154175
>>> timeit.timeit('x,y = imap(int,line.split())','from __main__ import line,imap')
4.3257410526275635
#generator expression
>>> timeit.timeit('x,y = (int(x) for x in line.split(" "))','from __main__ import line')
4.897794961929321
>>> timeit.timeit('x,y = (int(x) for x in line.split())','from __main__ import line')
4.732620000839233
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,split()似乎表现得更好split(" ").


如果您保证在0到9之间输入数字的ascii,那么您可以使用ord以下方法做得更好:

>>>timeit.timeit('x,y = [ord(x)-48 for x in line.split(" ")]','from __main__ import line')
1.377655029296875
>>> timeit.timeit('x,y = [ord(x)-48 for x in line.split()]','from __main__ import line')
1.3243558406829834
Run Code Online (Sandbox Code Playgroud)

但这对你的输入施加了严格的限制.


您可以尝试的另一个想法(我不知道性能影响是什么),但您可以从sys.stdin以下内容中读取您的行:

import sys
for line in sys.stdin:
    x,y = [ord(x)-48 for x in line.split()]
Run Code Online (Sandbox Code Playgroud)

  • `split()`和`split("")`实际上并没有做同样的事情...... http://docs.python.org/library/stdtypes.html#str.split (2认同)