こんにちは、堀です。
自分は、去年の5月から競技プログラミングのAtCoderにPython3で参加しています。
途中で長期間サボったりしながら、やっと合計18回参加できました。
まだまだこれからも勉強しなければいけないことはたくさんありますが、
Python初心者視点でアルゴリズム以外のところで
あらかじめ知っておけばよかったと思ったことを2つご紹介します。
1)普通のPythonよりPyPyを使った方が早い!
AtCoderは競技プログラミングですので、解答したプログラミングを実行したときの処理が遅いものについては TLE (Time Limit Exceeded)
というステータスで不正解扱いとなります。
ところがPythonは、他の言語に比べて遅いと言われています。
そこで通常のPythonより早いPyPy
というPythonの代替実装を選択することで
競技プログラミングを有利に進めることができます。
実際自分がPythonを選んだ場合TLEになっていたものがPyPyを選んで正解になっていたものがいくつかありました。
(例えばD - Knapsack 1でPythonでTLEでPyPyでOKになることがありました。)
何がなんでも純正のPythonで回答を行くぜ!という考えがなければ、PyPyを選択することをお勧めします。
PyPyとはどう言ったものなのかについては、A-STAR様のこちらの記事がわかりやすかったです。
2)Pythonには再帰関数の再帰回数に上限が存在する!
Pythonは、無限に再帰してクラッシュするのを防止するために、再帰する回数の上限値が設定されています。
この上限値に引っかかってエラーが発生し不正解となってしまうことがあります。
この状態になるとどこが悪いのかをデバックしても中々解決できずに時間が溶けていってしまいます。
自分は問題 ABC287 Cで、このエラーで解けなかったという悔しい思い出があります。
このエラーを回避するためには再帰回数の上限値を引き上げる必要があり、sys.setrecursionlimit
を使って設定します。
再帰関数を使う場合には、とりあえず以下のコードを設定しておくことをお勧めします。(10の7乗まで再帰処理が可能になります。)
import sys
sys.setrecursionlimit(10**7)
まとめ
以上が私がご紹介したい内容でした。
競技プログラミングで「合っているはずなのに失敗する!なんで!」となったときは
プログラミング以外で問題が発生している場合もあるためご紹介させていただきました。
とは言いつつ間違いの大半は、やはり自分のプログラミングが間違っていることが原因ですね。
これからも勉強していい成績が残せるように頑張っていきます!!
プロフィール
-
システム運用を長年経験しているエンジニアです。
DevOpsについては勉強中です!!