Wizard In The Market
システムトレードの魔術師

*

Rust で Python の拡張ライブラリ作成 と numpy との性能比較

公開日: : 最終更新日:2017/12/07 Python, Rust , , , ,

この記事は Python Advent Calendar 5日目の記事です。遅れてすみません。

Rust で Python の拡張ライブラリを書く

なぜRustなのか

この当たりを書いていると時間が無くなりそうなので、割愛したい。ただ、C++に馴染みのあるユーザーで高速に動作するコードを手っ取り早く書いていくにはRustが良さそうであるというのが自分なりの理解。特に、パッケージマネジャー当たりの優秀さはC++にはなくとても助かりそうである。メモリマネジメントもC++よりストレスレス。

PythonのAdventでRustなの?

Pythonのヘビーユースしだすと、C/C++ Extention を書いたり、Cythonなどを使って高速化していくことは特別なことではなくなる。そのひとつの選択肢として、これからはRustが良さそうだということで、勉強を兼ねて今回の記事を書くことにした。私自身はRustの初心者なので、間違っているところ等があればぜひご指摘いただきたい。

Rustのインストール

Linux / MacOS ユーザーには上記コマンドで一発でインストールできる。Windowsユーザーはインストーラーを使ってインストールするが、RustはWindowsでは結構難があるので、その当たりは注意してほしい。

Rust コンパイル用 setuptools-rust をインストール

Rustをpythonのsetuptoolsを使ってコンパイルできるライブラリ。python setup.py を使って、rustのライブラリを作成できるようになる。

Python Rust Extention

どうやら2本ある様子。他の記事ではだいたい、rust-cpythonを紹介しているのが多い。

rust-cpython

PyO3

比較

rust-cpython custom class

  • rust-cpython uses whole new language based on macros
  • it is very hard to extend py_class! macros, for example async/await support.
  • generated functions are used for access to struct attributes.
  • To drop PyObject GIL is required.

pyo3 custom class

  • use proc_macro and specialization for class implementation (nightly is required)
  • pyo3 does not modify rust struct. it is possible to define needed traits and make rust type compatible with python class without using #[py::class] macro.
  • class customization is based on specialization and traits and associated types. separate trait is defined for each type
  • of customization (i.e. PyMappingProtocol, PyNumberProtocol). macro is used for simplicity, but it is possible to make rust type compatible with specific customization without using proc macros.
  • pyo3 does not inc ref for borrowed ptrs, PyObject does not need GIL to drop.
  • pyo3 at least 15% faster.

pyo3 のが速い(イケてる)と書いているので、 pyo3 を使っていきたかったが、rust-numpyがrust-cpythonにしか対応していないので、rust-cpythonを使う。githubスターはrust-cpthonのほうが多い。setuptools-rustはPyO3の開発チームによるもので、READMEではpyo3のみが紹介されている。

プロジェクト作成

どうやら、rust-cpythonは2.7では現状動かない様子。Python3 に環境を変更する。

Cargo.toml

Rustのライブラリの作成を行うので、必要dependenciesをセットしてください。rust-numpyはgithubから直接取得しておかないとちゃんと動かなかった。

lib.rc

rust-numpyrust-ndarrayに変換してくれるので、sum functionを呼んでみました。rustの拡張は引数とか返り値の設定とかを都度読み込みの設定をしなくていいので楽ですね。

setup.py

Build python package

性能比較

結構頑張ったけど、結局自作のnumpy用高速計算パッケージが一番早くて、numpyの標準ライブラリにも及ばない感じ。軽く調べたところ、rust-numpyのデータ変換だけで0.6秒かかっているので、速度で勝負するのは根本的に厳しそう。高速化できるのかな。

Github Repo

参考記事

RustでNumPyを拡張する – Qiita
はてブ数
Pythonの利点対話的にデータの加工、解析、可視化 on Jupyterグルー言語的用法公式・非公式によってPythonインターフェースはだいたい用意されてい...
にほんブログ村 為替ブログへ 
Fx-Kirin

About Fx-Kirin

2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。

Adsense

  • このエントリーをはてなブックマークに追加
  • Pocket
  • 67 follow us in feedly

関連記事

Python2 から Python3 へのC Extension の移行

最初に追加 モジュールの初期化と状態情報を書き換える initmyextension 関数などの初期状態の関

記事を読む

絶対ダメ! マルチスレッドでの共通変数のインクリメント演算

デバッグ中の発見 とあるマルチスレッドプログラムをPythonで書いていた際に遭遇した誤使用です。C/C++等

記事を読む

no image

stop automatically closeing vim-ipython output with jedi-vim

Even though I commented out the following code in vim_ipytho

記事を読む

PythonのThreadを待機させるか、必要の度に作成するのかのベンチマーク比較

QueueとThreadのベンチマーク比較 2つのケースについて比較検証してみました。 実際に処理する内

記事を読む

Interactive Brokers 証券の Python API を利用する

Interactive Brokers 証券とは 日本には珍しく自動売買プラットフォームが提供されいてる証券会社です。

記事を読む

話題のクローラー・スクレイピング!PythonならScrapyが超優秀な件

Rubyの読書会に行ったら、Pythonの面白いお話を聞けたというお話です。 Rubyクローラー本の読書会に参

記事を読む

numpy の2つ行列で片方にあるものだけを抽出する。

numpy で2つの時間のインデックスをarrayデータとして持っていて、x にはない時間のインデックスがyにはあっ

記事を読む

PYPIへの登録を10秒でできるようになる方法

pip 使ってますよね Pythonを使っている人であれば、pip installでライブラリをインストールするこ

記事を読む

SQLAlchemy のマイグレーションライブラリ Alembic を使ってみる。

SQLAlchemyの作者が作ったデータベースマイグレーションツール。個人的には、SQLAlchemyは使わないが、

記事を読む

Quantopian の pyfolio を単利運用に対応させる。

pyfolio は どんなデータを入れても複利運用として計算してしまうので、人によっては望まない検証方法だったりし

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Adsense

PYPIへの登録を10秒でできるようになる方法

pip 使ってますよね Pythonを使っている人であれば、pip installでライブラリ

The art of debugging with GDB, DDD, and Eclipse の読書メモ

GDBの勉強がしたくて、下の本を原著で読んでみました。10年前の本だけど全然現役でした。

JupyterでボタンからJavascriptを実行して追加のアウトプットをさせない方法

Javascriptを実行するとアウトプットセルの行が増える これがとても面倒だった。上の

まだBokehで消耗してるの?これからはPandas-Bokehを使おうぜ

タイトルはあまり気にしないでください。全然、Bokehで消耗する価値があるとは思っています。ただ

SQLAlchemy のマイグレーションライブラリ Alembic を使ってみる。

SQLAlchemyの作者が作ったデータベースマイグレーションツール。個人的には、SQLAlch

→もっと見る

PAGE TOP ↑