Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

stackless pythonのお話

比較

stackless python

  1. 処理系自身に手を入れている(srcのStackless/、Python/以下)
  2. 処理の評価(eval)毎にcstack objectを生成し、状態を保存する
  3. いわゆるスケジューラー(ラウンドロビン)がデフォルトで組み込まれている
  4. bytecode的には通常のCPytonと同じ(内部でcstack objectを持ってるだけで他は同じ)

greenlet

  1. 処理系自身には手を入れていない
  2. Cのstackをコピーすることで継続を行う。(greenletを使用している箇所のみ)
  3. スケジューラーがデフォルトでない。(親に戻るってところはデフォルトで入る)

stacklessの気になるところ

stacklessは評価毎にcstackを保存しまくるため、通常の処理自体遅くなる。
(1割程度)
stacklessは自前で保存しているcstack objectを見に行くので再起でCスタックを消費しない。
(これが有用になるケースはそんなにない気がする)
taskletのスケジューリングを自前でやりたい時の情報が少ない。
(channelベースが多い。insertとかで実はできるんだけどね)

コスト

生成コストはプールするとかでなんとかなったりするのであんまり気にしてない。
切り替えコストはどっちが速いのだろう???

  1. greenletは切り替わるたびCのstackをheapに突っ込む。そしてそこを参照してコピー、リストア
  2. stacklessは保持しているcstack objectからコピー、リストア

一応greenletはCのスタックを突っ込む時に拡張したメモリをrestoreの際に開放しているけど、
stacklessはcstackをどうしてるんだっけ?

トータルで見るとどっちもどっちな気がするなあ。
ただ通常実行速度の低下を考えるとgreenetでいい気がしてきたなあ。

stackless pythonをわざわざビルドしてまで使う有用性が見えないんだけど誰か教えて下さい。