ここ数年、秋の定期イベントとなりつつある Python の国際カンファレンスに今年も行ってきました。
普段は人の顔が写った写真は公開しないけど、イベント自体が撮影を前もって断っていたのでここに置いてみた http://www.flickr.com/photos/tsuyukimakoto/sets/72157635561890295/
去年は担がれてパネルに参加させてもらいましたが、今回は通常のパトロン枠で参加です(ほんの少し余計に参加費払うとすいた受付を通れてパンフにアイコンとURLが乗って参加パスのストラップカラーが違って優越感までモテちゃうお得な参加枠です。費用は学生補助、遠方補助に役立てられるらしいです)。
以下、ただのメモ 2013/09/14 --------------------------------------------------------------------------- 台風18号接近中
各セッションの動画 http://www.youtube.com/user/PyConJP
実践 C 拡張モジュール開発
https://speakerdeck.com/mopemope/shi-jian-c-kuo-zhang-moziyurukai-fa
Rustはやめておけ ctypesで十分なことが多い pypyは高速だし、それだけでいいかも
ctypesはインタプリタで実行されるのでそこまで速くない
Cythonは学習コスト高い
Cythonの構文とか
C/API 自体も知らないといけないし
Cのデバッガだけじゃ駄目
PyCFunctionはFrame(Frame自体もPyObject)を生成しない
これだけで2割くらい速くなることがある
valgrind(メモリチェックツール)
Python自体を専用にビルドする
--prefix=hoge --with-pydebug --with-valgrind
→ メモリプールが無効化されてリーク検出が楽チンになる(debug)
→ 生存オブジェクトの数とかがインタプリタに表示される
coredumpを吐けるように
$ ulimit -c unlimited
setuptools, distributeのインストール
→ python setup.py develop すると開発ディレクトリがライブラリパスになって楽チン
CとPythonのソースは分けた方がいいかも
→ https://github.com/mopemope/jega
→ srcにCいれてプロジェクト名にpython入れたり
Makefileはいらない。 setup.pyで
ソースは1機能毎に分ける。ヘッダとソースをついにする。
共通のヘッダも。モジュールのメインに対応するソースに書くと良い。
命名規則
GILを必要に応じて解放したりする
Py_BEGIN_ALLOW_THREADS .. io待ちとか Py_END_ALLOW_THREADS Iterも使える。 PyObject_GetIter PyIter_Next
PySequence_Fast 速い(事前にサイズがわかってないといけない)
デバッグはDEBUGマクロでログイングした方が楽チンかも
do{}while(0) はコンパイラが無いことを知ってくれる
大きくなってきて拡張を分割したい場合
C/APIからモジュールをimportできる(関数はキャッシュしておいた方が良い)
はまりやすいやつ GC が走る前にオブジェクトが回収済み
Cython(シャイソン?サイソン?)による拡張モジュール開発
http://www.slideshare.net/atsuoishimoto/introduction-to-cython
いろんな人の発音を聞いた感じだとシャイソンって読む?
拡張モジュールは通常C/C++で開発されたもの。
お前はPyObject_SetItem()、PyList_SetItem()、PyList_SET_ITEM()の違いを覚えているのか!?
CythonはPython専用のプログライング言語でコンパイラ
Pyrex → Cython
利用プロジェクト
lxml
Sage www.sagemath.
SciPy
PyYAML
PythonのCodeをCythonでコンパイルしたりできる。ジェネレータとか一部非互換。
属性のcdef、publicをつけるとPythonからも見える
型宣言もできるけど、ビルド時にエラーにならない条件もある。ただ、宣言しておくとCodeの最適化がされたり、ビルド時にエラーになったりする。
C側をimportもできる。
cdef extern from "hoge.h"
標準Cランタイム関数は定義済み。cimportで読み込む。
from libc.math cimport sin
? OpenMP?(マルチプロセスライブラリ)
with nogil: GILを解放して動かせる。いっさいPythonのライブラリが使えない。
c++も使える。
Cythonソースファイル → cythonコマンド → (Cソースファイルができる) リンクしたりする
setup.pyで from Cython.Build import cythonaize して sythonaizeでext_modulesにCythonソースファイルを指定すると良い。
pyximportをimportして、pyximport.install()しておくと、Cythonのモジュールをimportしたときに動的にコンパイルされる(簡単なものだけ)
newtonでベンチした感じ
Python : Cython : Cython(型指定:Early binding) 36.3msec : 21.7 msec : 2.89msec #pure c より少し遅い関数呼び出し(takというよくでるやつ)でtak(18,9,0)した感じ
Python : Cython : Cython(cdef) 2.74sec : 1.47sec : 36.9msecgdbが使える。あるいはprintfデバッグ。
Let Python talk native
moriyoshi がテンパってるの始めて見た。ls cd ls cd!
E-cellプロジェクトの経験から話す
CAPIはスピードアップ用なら良い
FFI Foreign Function Interface 言語間のラッパ
ABI Application Binary Interface
SWIG / ctyps (libffi-based, runtime FFI) / cffi / Cython / Boost.Python
用途によるけど SWIG か Boost.Python か?
mopemope の CAPI の話と、 atsuoishimoto の Cython の話も聞いたので、ドウシタモンカと思っている。
LT
一発目の esehara さんの勢いにやられた。 GO! OK!
かなりの人が英語でやってた。
hoka
ツイートを眺めてて他に気になったもの
gurobi 最適化のsolver
Nodebox
楽しかった
さらに台風が大接近のなか新宿は工学院大学では sprint が行われているようですが、自分は不参加なので2日間で終了。
PyCon APAC 2013は、気づけば当日は電車代以外にお金を使わなかった。
大きな技術系のイベントって、長めの休憩があると自分のコミュ力の無さに絶望したりするんだけど、 PyCon はランチも弁当が用意されていて、食堂に大量のボッチがいるので、ボッチだけの席とかになると絶望も無いし顔見知りができたりするので良い。ボッチだけど話したい人には ymotongpoo が呼びかけを行ってたし、素敵。コーヒーブレイクもあるよ。
会場提供の工学院大学をはじめ(新宿駅からずっと屋根付きで到着できるので悪天候でもへっちゃら)、スタッフ、スポンサー、スピーカーには感謝いっぱい。
来年の PyCon APAC は台湾開催らしい。
そして、来年の PyCon JP の座長は takanory さんになるらしい。来年もよろしくお願いします :-)