雑食性雑感雑記

知識の整理場。ため込んだ知識をブログ記事として再構築します。

Boost.numpy 活用 〜ライフゲーム作って高速化してみる〜

Boost.numpy が使えるようになってきたので、ちょっと遊んでみました。
まず、Only Python でライフゲームを作成し、それを Boost.numpy に置き換えて速くなるかどうか試してみました。

( お遊びなので、本格的な速度評価はしてないです。 )

一応、前記事は以下。
Boost.numpy ことはじめ - 雑食性雑感雑記
Boost.numpy ことはじめ その2 (戻り値) - 雑食性雑感雑記

ライフゲームについては――

特定のルールに従ってマス目を塗り替えていくアレです。ALifeとかに詳しい内容いっぱい載ってるので割愛。

今回は、一番よく使われているであろうルールで実装しています。
・ 自分が生きているとき → 周囲生存数が 2 or 3 なら生存。それ以外は死亡。
・ 自分が死んでいるとき → 周囲生存数が 3 なら復活。

あと、オリジナルルールとして、ランダムで問答無用に復活するようになっています。
まあ、ライフゲームのルール自体は本筋じゃないので。

コード

Github 上に置いたので、詳しくはそちらを参照してください。
https://github.com/KazukiNagasawa/boostnumpy_lifegame
( ブログ書くの忘れて3ヵ月放置していたから github の投稿日時と乖離があるの… )

なお、以下 Ubuntu OS、Intel I7 マシンで実行しています。

Python 版

numpy 使ってライフゲームを実行し、OpenCV で描画したものを動画キャプチャしてみました。それをアニメーション gif 表示。
やっぱり遅いです ( gif 作成時に fps 調整している訳ではないですよ。 )

( only python )
f:id:kazuki_nagasawa:20180719130533g:plain

Boost.numpy 版

ライフゲーム実装部をすべて C++ (Boost.numpy) に移してみました。処理に違いが出ないよう、できるだけ Python 実装に寄せた形で作成しています。
同サイズの実行ですが、爆速になりました!!

( boost numpy )
f:id:kazuki_nagasawa:20180719130549g:plain

おまけ

Boost.numpy での実行が爆速になったので、調子に乗って Color 版を作ってみました。
RGB 間のつながりがなく、3つのライフゲームが RGB レイヤで重なって表示されているだけなのであまり面白くないですが…。
( 繋がり意識して3次元的なライフゲーム作ってみても面白いかも。 )

f:id:kazuki_nagasawa:20180719134249g:plain