〈python〉競プロで処理を高速化したい

python競技プログラミングをするとき、TLEが起こるのが悩み。
処理の遅いpythonでも、高速化できる裏技がたくさんありそう。


標準入力:sys.stdin.readlineを使う

組み込み関数のinput()を使っていたが、sys.stdin.readlineを使った方が早い。
ただし末尾の改行文字も読み取ってしまう(inputは改行文字を取り除いてくれる)。
sys.stdin.readline().rstrip()を使うのが良さそう。

import sys
a = sys.stdin.readline().rstrip()

Listを使いすぎない

なんでもListで処理しがち。でもListへのアクセスはとっても遅い。
末尾へのappendやpopは早いが、indexを使ったそれ以外の場所への挿入・代入はとにかく遅い。in,min,maxなどもO(n)の処理になる。
データの検索をしたいならdictやset、データの操作をしたいならcollections.dequeを使って、Listで処理をしすぎない。

内包表記を使う

list を作成するとき、

for i in range(10):
    list.append(i)

このようなfor文を使いがち。毎回appendを参照するコストがかかるそうなので、内包表記を使った方が早い。

list = [ i for i in range(10)]

ローカル変数を利用する

グローバル変数にアクセスするよりもローカル変数にアクセスする方が早いらしい。
コードを直接書いて実行するよりも、main関数にコードを入れるだけで早くなる。

def main():
   #処理を書く

if __name__ == '__main__':
    main()


Atcorderで他の方のコードを見ていると、他にもたくさん高速化できることがありそう…。奥が深い。
またそのうち他の方法もまとめたい。