PyCon JP 2011 に行ってきました
自分が見たセッションの内容をまとめました。その他のセッションについては、aodagさんの資料まとめやnokunoさんの内容まとめをみてください。
Keynote
- パッケージング
- 今のパッケージングは複雑なので、新しくpysetupを作っている。Python3.3またはdistutils2で使える。詳細はPEP376。
- pysetupの特徴
- パッケージのアンインストール可能
- setup.pyに加えて、setup.cfgを書く
- データファイルの管理
- 現状
import os.path here = os.path.dirname(__file__) pic = open(os.path.jpoin(here, 'pic.jpg'))
-
-
- pysetup
-
# データファイルの場所はsetup.cfgとsysconfig.cfgに記述しておく from packageing.database import get_file pic = get_file('MyProject', 'pic,jpg')
- バージョンのつけ方
- PEP386に準拠するべき
- 1.1 < 1.2a1 < 1.2 < 1.3.dev2 < 1.3 < 1.3.2
- Python3
- Python3.0にはバグがあるから使わない。Python3.3から使いましょう。
C APIへの誘い
Asynchronous Python Programming
PyQtではじめるGUIプログラミング
- Qtの特徴
- 読み方は「キュート」
- SIGNAL/SLOTを使い、イベントを結び付けてプログラミングする
- アプリケーション作成の流れ
- 開発ツール
- Qt Assistant:ドキュメントをローカルで読める。
- Qt Designer:GUI作成ツール。上級者向け。
- 次のステップへ
- 日本語書籍はあまりない
- Qtはドキュメントが充実しているので読もう
Tuning Python Code
High Performance PythonというEuroPython 2011の資料が分かりやすい。
モニタリングツール
まずはモニタリングツールを使い、Disk I/Oなどのボトルネックを調べる。
- top
- CPUやメモリ使用量の表示
- dsat
- strace
$ strace -c python -c "print 'hello'"
プロファイラ
CPUがボトルネックだと分かった場合はプロファイラを使い、コードの中のボトルネックを調べる。PythonレベルとCレベル、両方のプロファイラに慣れておくとよい。
Pythonレベル (cProfile)
$ python -m cProfile myapp.py
Cレベル (perf)
$ perf record python myscript.py $ perf report
可視化ツール (Run Snake Run)
$ python -m cProfile -o callgrind.out myapp.py $ runsnake callgrind.out
高速化
- 正しいアルゴリズムとデータ構造を選択する
- dict, tuple, list, deque, heapq, ...
- 実行するバイトコードを減らす
- ループの代わりに組み込み関数を使う
- functools, itertools, collections, heapq, bisect,...
- 辞書の読み込みを減らす
- グローバル関数をローカル関数に移す
X = 1 def foo(): """グローバル変数Xを直接参照。遅い。""" for _ in xrange(100): X def bar(): """1度ローカル変数xに代入し、ローカル変数を参照。早い。""" x = X for _ in xrange(100): x
- 循環参照をなくす
- 不要になった循環参照を切る。
def foo(): """循環参照。GCの際に遅くなる。""" for _ in xrange(1000000): x = [] y = [x] x.append(y) def bar(): """不要になった循環参照を切る。""" for _ in xrange(1000000): x = [] y = [x] x.append(y) del x[:]