CPython 3.2ソースコードリーディング第2回

今日はCPython 3.2ソースコードリーディング勉強会に参加してきました。

まず、この勉強会に参加したモチベーションから。

私はPythonをまったく使ったことがなかったのですが、最近意識的に使うようにしています。来年からの就職先ではPythonを重要な言語に位置づけているので今のうちに慣れておきたいって気持ちもあるのですが、一番は私が研究対象としている(C)Rubyと対比されることが多いからです。研究に役立つ知識が得られたら嬉しい。敵を知り、己を知れば百戦危うからず、みたいな。

肝心の勉強会の内容は次の通りです。

PyObjectの構造,CでOOPする方法 (@cocoatomo さん)

Cでオブジェクト指向言語処理系を実装する方法と、その実例としてCPythonのPyObject周りを説明されてました。CRuby処理系とほぼ同じ仕組みだったので、この辺りはすんなり理解できました。

参照カウンタ (@mayahjp さん)

Pythonにおける参照カウンタの話。Py_INCREFとPy_DECREFを使って参照カウンタを増減していたり、カウンタの増減の前後で不正なデータアクセスを起こさせない仕組みなどを説明されてました。

この辺りは積ん読状態のGC本を片手にしっかりと読んでみたいところ。

表とハッシュと連想配列 (@finalfusion さん)

タイトル間違っているかも。Pythonを含む様々な言語におけるハッシュ実装の仕組みとその違いについての紹介でした。言語ごとにハッシュ値の作り方がまったく違うのが面白かったです。ハッシュサイズは素数にするべきか、2の冪乗にするべきか、とか、単純にビットシフトさせたものをハッシュ値として使っちゃう、とか。是非読み比べてみたいところ。

dict実装の効率化 (@methane さん)

Python 3.2 では小さなdict (small table) はオブジェクト内に埋め込まれていて、ある程度の大きさになると外部にメモリを確保してそちらのみを使うようになるらしい。そうなるとsmall tableのスペースが無駄になるので、そんなものは最初からオブジェクト内に含めないようにすることで省メモリ化しようという話。小さなdict用にfreelistを用意しておいてそこから割り当てたり、memsetをコールする回数を減らして効率化を図ったりしているそう (この辺りは聞き逃してしまいました)。

結果は思ったよりも良くなく、もう少し効いても良さそうなのになー、と感じました。

SphinxとblockDiagで手軽にドキュメント (@tk0miya さん)

ドキュメント生成ツールSphinxと、Graphvizみたいな記法で簡単にシーケンス図などが描けるblockDiagなどの紹介でした。Sphinx面白いですね。機会があれば是非使ってみたい。blockDiagはJSONPでシーケンス図が描けてこれまた楽しそうなツールでした。



そんなこんなで4時間あっという間でした。とても楽しかったです。主催者、発表者のみなさん、ありがとうございました。

やっぱ勉強会は話者として参加したいなぁ・・・Pythonネタがあれば良いんだけど。