競技プログラミングで Python を使う時は関数にしよう

すごいシンプルなんですが競技プログラミングで Python を使う時は関数を定義してその中で問題を解こうという話です。


Global 変数はアクセスに時間がかかる

理由はすごいシンプルで関数内の変数は実行時(解釈された時)に固定の配列に格納され、インデックスでアクセスされます。一方で Global 変数は実行時にはインデックスでアクセスされない(実行時に数が固定できないから)ため、ローカル変数と比べてアクセスに時間がかかります。


どのくらい違うの?

問題とコード、もちろん実行環境にもよりますが、AtCoder の問題を解いていた時に、全く同じコードで、

・グローバル変数を定義して解いた時にはTLE

・関数内にローカル変数として解いた時にはAC

というケースがありました(見てみたら400-500msec違うテストケースも)。

というわけで競技プログラミングで Python を使う時は関数内に解法を書く習慣をつけるとよさそうです。


参考

https://stackoverflow.com/questions/11241523/why-does-python-code-run-faster-in-a-function