Python に関する遅いものたちをまとめました.
Python
Python は遅い.
改善策
- c++ を使う
numpy でないもの
numpy でないものは numpy であるものより遅い.
改善策
- numpy を使う.
tuple
tuple に関するものは大体遅い.dict の key にしたり,リストに突っ込んでソートしたりするとやばい.tuple の比較自体が遅い.
改善策
- tuple を使わない.
- 例えば 2 要素の tuple で,要素が 2 つとも 109 以下なら,(x, y) は z = (x<<30) + y のように 1 つの整数に変換する.z から x,y を復元するには mask = (1<<30)-1 として x = z>>30, y = z&mask とすればよい.
- tuple のソートは key を指定する
再帰
PyPy だと特に遅い.
改善策
- 再帰をしない.
- 非再帰 DFS など.
- おまじないをする
再帰の関係でPyPyだとTLE/MLEするやつ
— eheka (@ehekatlact) 2022年2月7日
先頭に
import pypyjit
pypyjit.set_param('max_unroll_recursion=-1')
と書くとPyPyでもACできるし、Pythonよりも早いことを確認
提出 #29147867 - AtCoder Beginner Contest 149 https://t.co/UvHYer4SNM pic.twitter.com/DOdqAspWsD
多倍長整数
263 を超えると途端に遅くなる.
改善策
- 多倍長整数を使わない.
多次元リスト
遅い.
改善策
- 一次元化する.
- 例えば H×W サイズの二次元配列 A は,長さ HW の一次元配列 A' に対して,A'[W * i + j] = A[i][j] とすればよい.
list の append
遅い.
改善策
- list のメモリをはじめに確保しておく.
入出力
入力がいっぱいやってくると詰む.
改善策
- sys.stdin.readline を使う
- 出力が複数行にわたるときは '\n' で join して一つの文字列で出力する
pow(x,k,mod)
何で遅いのかよくわかってない
改善策
- mod を引数に取らないと除算高速化をしてくれるみたい
def fpow(x,k): res=1 while k: if k&1: res=res*x%mod x=x*x%mod k>>=1 return res