# 最適化したい。

Python のコードは、
書けば書くほど遅くなります。

低レベルにガリガリ書き込んだ方が速くなりそうな気がしますが、 Python では、そうではないところがあります。 この主な原因は Python のコードで遅いからです。

基本的には Python のコードは、書けば書くほど遅くなります。 反対に短いほど速いです。  すべての場合で当てはまるわけではないのですし、あくまでもそんな雰囲気かな程度の話です。 

Python のコードではなくC 言語で書かれた「組み込み関数」や、 「標準ライブラリ」に処理を任せてしまうと速くなるという感覚です。

「組み込み関数」とは import しなくても使える min, max など。 「標準ライブラリ」とは pip install しなくても import できるモジュールやパッケージのことです。

比較したもの一覧
番号 分類低レベルな書き方 高レベルな書き方
1 順次速 リテラルの参照遅 変数の参照
2 順次速 変数の参照 遅 属性の参照
3 順次速 ベタ書き 遅 関数
4 反復遅 while 文 速 for 文
5 反復遅 for 文 速 リスト内包表記
6 分岐遅 if 文速 try 文

低レベルな書き方、高レベルな書き方というのは、 私の主観で書かせていただきました。 基本的に Python に限らずプログラミング言語のコードは、 順次、反復、分岐の3つにわけられます。 分岐は if, try 文, 反復は for, while 文, 順次はそれ以外です。

また今回このカテゴリ「高速化」で利用するコードは、 こちらにまとめました。

全体像だけ、ごくごく、ざっくり眺めていただければと思います。 各ページで、最初に測定対象のコードを列挙するので、どれが速いか選んでいただいて、 あとは結果を見て、「ふーん」と読み流すような感じを想定しています。 この記事は、あくまでも全体像なんとなくの  雰囲気  をお伝えするためのものです。

実際に自分が書いているコードを cProfile などを使って、 計測、遅い場所を特定して最適化する方が、 きっと楽しいと思いますし感覚が掴めるのも速いと思います。

# 背景

ごくたまに真面目に Python のコードを書いていると、 どちらのコードが正しい書き方なのか、ふと疑問に思うときがあります。

そんなとき最適化する、すなわち2つの書き方の時間を計測することで、 どちらが Python らしい書き方なのかわかるときがあります。 完全解は与えてはくれませんが、書き方のなんとなくの指針を与ええてくれます。

具体的に言えば、項番 4, 5, 6 が該当します。 for 文で書くべきか while 文で書くべきか、 あるいは リスト内包表記で書くべきか for 文で書くべきか、 そして try 文で書くべきか if 文で書くべきか、 この辺りですこし引っかかっていました。

ただし、ここで書かれていることを実行しても、あまり速くはなりません。 そのため、こういうものもあるんだな程度に、押さえておいていただければと思います。

なぜ、このような最適化が、 実行速度に対して意味がないのかは、最後にご説明させていただきます。

# 補足

ここで取り扱うこと
• Python の構文を使った処理速度の比較
• 最初から入ってる組込モジュール、クラス、関数を使った処理速度の比較

ここで取り扱わないこと
• Numba など外部ライブラリの利用
• C など別言語への書き換え(例えば Cython を利用して C 言語に書き換え)

請注意
 ここに書かれていることを気にして、コーディングしないでください。  ここに書かれていることは かなり重箱の隅をつつくようなことをしています。 理由は最後にご説明させていただきます。

Last Updated: 11/11/2019, 11:17:29 PM