コーディングコンテストでは、次のような入力に遭遇します。
2 3
4 5
したがって、次のことを行います。
m, n = [int(x) for x in raw_input().split(' ')]
同じことをするより速い方法はありますか?
コーディングコンテストでは、次のような入力に遭遇します。
2 3
4 5
したがって、次のことを行います。
m, n = [int(x) for x in raw_input().split(' ')]
同じことをするより速い方法はありますか?
すべての実用的な目的のために、それはあなたが得ることができるのとほぼ同じくらい速いです。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()]
Use map()
, it's faster than list comprehensions when used with built-in functions:
m, n = map(int, raw_input().split())