在编码比赛中,我们会遇到如下输入:
2 3
4 5
所以我们做了以下事情:
m, n = [int(x) for x in raw_input().split(' ')]
有没有更快的方法做同样的事情?
答案 0 :(得分: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
令人惊讶的是,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
但是这会严重限制你的投入。
您可以尝试的另一个想法(我不知道性能影响是什么),但您可以从sys.stdin
读取您的行:
import sys
for line in sys.stdin:
x,y = [ord(x)-48 for x in line.split()]
答案 1 :(得分:1)
使用map()
,与内置函数一起使用时,它比列表推导更快:
m, n = map(int, raw_input().split())