tanihito’s blog

デジタル・新規事業開発・健康など、興味のあることについてつらつらと書いてきます。

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

  • Blocking I/O
    • スレッド:GILがあるので普通は使わない
    • プロセス:スレッドよりもプロセスを使う
  • Non-Blocking I/O
    • コルーチン:greenletなど
    • Events (select/epoll):Twistedなど
  • 結論
    • 様々な手法を組み合わせて使おう。
    • CeleryTwistedが便利だよ。

Python と MongoDB でWEB開発

PyQtではじめるGUIプログラミング

  • Qtの特徴
    • 読み方は「キュート」
    • SIGNAL/SLOTを使い、イベントを結び付けてプログラミングする
  • アプリケーション作成の流れ
    1. コンセプトを決める:重要と思う点を列挙する
    2. コンセプトに基づいてGUIをデザインする:紙と鉛筆を使う。
    3. GUIコンポーネントを積み重ねて構成する:Webページをtableタグでデザインするのと似ている。
    4. コンポーネントの親子関係を図にする
    5. コンポーネントの相互作用を図にする
    6. 図を見ながらプログラミング!
  • 開発ツール
    • Qt Assistant:ドキュメントをローカルで読める。
    • Qt Designer:GUI作成ツール。上級者向け。
  • 次のステップへ
    • 日本語書籍はあまりない
    • Qtはドキュメントが充実しているので読もう

Pythonで1万台のiPhoneを管理する

Pythonによる日本語自然言語処理

Tuning Python Code

High Performance PythonというEuroPython 2011の資料が分かりやすい。

モニタリングツール

まずはモニタリングツールを使い、Disk I/Oなどのボトルネックを調べる。

$ 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[:]

その他

感想

ランチやコーヒーブレイクなどの交流機会があり、多くの人と話せました。一番嬉しかったのはエキPy著者のTarekに会えたことです。さすが「出会い系Python」ですね!1人で参加したのでどうなるか心配でしたが、とても楽しめました。
それと、懇親会でTシャツを頂きました、ありがとうございます!

反省点
  • 名刺を作る:初対面の人と話すときには、やっぱり名刺が便利。
  • Macを買う:今回のMac率は約80%(当社比)。やっぱりプログラマーMacなのかな。