Effective Python ―Pythonプログラムを改良する59項目
- 作者: Brett Slatkin,石本敦夫,黒川利明
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/01/23
- メディア: 大型本
- この商品を含むブログ (4件) を見る
目次
- 目次
- はじめに
- Pythonのランタイムの種類
- プライベート属性はアンダーバーを2つ先頭におく
- リストや文字列の空判定にlenなどは使わない
- mapやfilterよりもリスト内包表記を使う
- rangeよりはenumarateを使う
- オプションのキーワード引数は、位置ではなくキーワードで与えるとコードが読みやすい
- どんなクラスオブジェクトでも__dict__ですべてのフィールド辞書にアクセスできる
- Pythonコードのプロファイルを取るにはcProfileを使うと便利
- 参考資料
はじめに
以前、C++の名著Effective C++を読んで
心に響いたことを記事にまとめました。
実はこのEffectiveシリーズは、
様々なプログラミング言語で発売されており、
PythonバージョンのEffective Pythonも発売されています。
Effective Python ―Pythonプログラムを改良する59項目
- 作者: Brett Slatkin,石本敦夫,黒川利明
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/01/23
- メディア: 大型本
- この商品を含むブログ (4件) を見る
今回もこのEffective Pythonを読んで、
心に響いたことをメモとして
残しておきたいと思います。
Pythonのランタイムの種類
Pythonには、標準のCで実装された
CPython以外にも、
- Jython: PythonのJava実装
- IronPython: PythonのC#,.Net実装
- PyPy: PythonのPython実装
自分の得意な言語と上手く連携できるとより便利ですね。
プライベート属性はアンダーバーを2つ先頭におく
Pythonは厳密にはクラスのプライベート属性は無いようですが、
アンダーバーを2つ先頭に置くことで、
プライベート属性を表すことができます。
Pythonにおけるプライベート属性は下記の記事が参考になります。
リストや文字列の空判定にlenなどは使わない
下記のように,リストや文字列が空の時は
if文にそのまま入れるとFalseが返る機能を使いましょう。
alist=[] if not alist: print("empty") astr="" if not astr: print("empty")
mapやfilterよりもリスト内包表記を使う
あるリストのそれぞれの要素に同じ処理を実施したいことは、
多々ありますが、
そのために良く使用されるのがmapやfilterです。
しかし、Effective Pythonでは、
リスト内包表記のforをmapの代わりに、
ifをfilterの代わりに使うことを推奨しています。
例えば、0から100の偶数リストを取得する場合には
下記のようなリスト内包表記を使います。
a = [x for x in range(100) if x % 2 == 0]
ちなみにリスト内包表記は、
for文などに比べて、非常に高速に処理できるらしいです。
rangeよりはenumarateを使う
あるリストに対してループを回す時に、
Pythonでは inを使うと思いますが、
同時にリストの添字の数字も取得したい場合があります。
そんな時は、enumerateを使うと便利です。
下記のようにリストの中身と添字を同時に取得できます。
list1 = ['a', 'b', 'c'] for (i, x) in enumerate(list1): print i,x
オプションのキーワード引数は、位置ではなくキーワードで与えるとコードが読みやすい
pythonの関数の引数は、
下記のようにキーワードでデフォルト値を決めることができますが、
def CalcHoge(a,b,time=200,length=10): u""" 何かの計算 """
上記のような関数を使う時に、
下記のように位置で引数を指定することもできますが、
CalcHoge(10,5,200,10)
下記のように、ちゃんとキーワードで引数を与えると、
どのようなパラメータで値を与えたのかがわかりやすくなります。
CalcHoge(10,5,time=200,length=10)
どんなクラスオブジェクトでも__dict__ですべてのフィールド辞書にアクセスできる
Pythonのすべてのクラスオブジェクトは__dict__というメンバ変数を持っており、
これは、そのクラスが持っているフィールド辞書、
つまり、メンバ変数やメソッドを辞書形式で保持しています。
例えば、下記のように、
mathモジュールの__dict__を表示すると、
多くのメソッドとメンバ変数を有していることがわかります。
複雑なクラスオブジェクトの中身を確認するのに便利ですね。
Pythonコードのプロファイルを取るにはcProfileを使うと便利
計算時間がかかるPythonプログラムを
最適化したい場合、プロファイルを取ることが重要です。
そんな時に便利なのが、
Pythonの標準ライブラリであるcProfileです。
(ただOSによっては、別途インストールが必要なようです。)
使い方は非常に簡単で、
下記のようにcProfileの中で対象のスクリプトを起動するだけです。
$ python -m cProfile -s time スクリプト名.py
すると下記のように、
計算時間が長くかかったメソッドが順番に表示されます。
参考資料
Effective Python ―Pythonプログラムを改良する59項目
- 作者: Brett Slatkin,石本敦夫,黒川利明
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/01/23
- メディア: 大型本
- この商品を含むブログ (4件) を見る