LoginSignup
2
1

More than 5 years have passed since last update.

Python デバッグ/最適化事始め

Posted at

主に競技プログラミングの際に、Pythonプログラムがバグった/やたら遅いが、何が原因かイマイチ把握できない時、いつも行き当たりばったりでやっていたので自分用のメモ。

1. デバッグ

1.1. print()

簡単なデバッグならこれが一番早い。1つの変数の状態なら十分把握できる。ただし複数変数を同時に更新していくときや、関数の挙動を見る時には出力結果が読みにくいので不向き。また、文字列と整数型を間違えているときに気づけない。

1.2. repr()

repr()は、「オブジェクトの印字可能な表現を含む文字列」(公式ドキュメント)を返す。整数型と文字列を変換するプログラムを書くときはprint()ではなくrepr()の方が良さそう。

>>> print(5)
5
>>> print('5')
5
>>> repr(5)
'5'
>>> repr('5')
"'5'"

>>> type(print(5))
5
<class'NoneType'>

>>> type(repr(5))
<class'str'>

1.3. Pycharmのデバッガ:beetle:を使う

これでデバッグのほとんど全てが解決する。pdbも正直これがあれば不要。新たにprint()とかrepr()とか書かなくていいしもう最初からこれ使えばいいかも。ただし有能すぎて一つの変数の変遷だけ追いたいときは逆に見にくいときもある。

2. テスト

テストでバグの箇所を特定し、デバッグでバグを除去する。classを定義していないとpycharmのテストは起動しないし、そもそもテストする必要がない。
unittestよりpytestの方が直感的で使いやすいという印象。時間もメモリも管理できる。Pycharmで使える。

3. 最適化

3.1. numpyを使う

要素が数値型なら、リストよりnumpyの方がメモリの少なく、計算も速い。累積和とか使うときは特に。
ただし呼び出しコストと、numpyの要素にアクセスするのは遅いことに注意。

3.2. 自己代入する

メモリ節約になる。時間は不明。

3.3. 文字列結合

joinを積極利用すると吉。

3.4. 内包表記と破壊的代入

内包表記の方が当然速いが、自己代入を内包表記でやるよりも、破壊的代入の方がメモリ使用量は少ない

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1