読者です 読者をやめる 読者になる 読者になる

座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

Python APIでC言語による拡張モジュールを試した

Python

Pythonのドキュメントの、このあたりの話題を試してみた。

Python インタプリタの拡張と埋め込み — Python 3.4.2 ドキュメント

渡された値が素数かどうかを返す関数 isprime(n) を2通りのモジュールで実装する。

素数判定のコードはWikipediaの記事にあったものを拝借した。素数判定 - Wikipedia

ひとつは純粋にpythonで記述したモジュール。もうひとつはCライブラリをpythonで利用可能にしたモジュール。 それぞれのモジュールで実装した関数を 10 ** 6 回 呼び出すのにどれだけ時間がかかるのか。 測った結果がこちら。

$ PYTHONPATH="math2_via_python3" python3 _time.py
6.18s user 0.06s system 99% cpu 6.264 total

$ PYTHONPATH="build/lib.cygwin-1.7.33-x86_64-3.2" python3 _time.py
0.36s user 0.06s system 101% cpu 0.411 total

言うまでもないことだけど、Cライブラリをラップしたモジュールのほうが速い。結果を見ると、およそ15倍速いということになっている。

有名な高級(?)言語の中では最速の実行速度を誇る。なのでスクリプト言語を利用し ている時に速度が出なくて困ったら、その部分をちょろっとCで書き直すと平気で100倍 速になったりすることもある。

プログラミング言語人気TOP10の簡易解説

Pythonだけで書くのに比べると、元の関数に加えて、Python API向けにラップした関数や、 モジュールとして登録させるための関数を書く必要があるなどで、生産性で劣る。

性能面で気になるところがあったら、試してみたいかなと思いました。ファイルI/Oで処 理速度が低下している場合はあまり効果ないと思うけど。 ただ、これを使うと、コンパイラアーキテクチャに起因する移植性の低下なんかも出や すいのかなと。 実際にcygwinLinux環境だと問題なく使えているが、Visual Studio環境だとうまくいか ないことが多かったような気がする。

広告を非表示にする