rpy2 パッケージを使用して、いくつかの R 機能を Python に導入しています。私が R で使用している関数には data.frame オブジェクトが必要であり、rlike.TaggedList を使用してから robjects.DataFrame を使用することで、これを機能させることができます。
ただし、まったく同じR関数とまったく同じデータを比較すると、パフォーマンスの問題が発生するため、ここで説明したようにrpy2低レベルインターフェイスを試して使用するようになりました - http://rpy.sourceforge.net/rpy2/ doc-2.3/html/performances.html
これまでのところ、私は試しました:
- numpy 配列の代わりに FloatSexpVector オブジェクトと DataFrame オブジェクトで TaggedList を使用します。
次のような辞書を使用して、TaggedList および DataFrame クラスをダンプします。
d = dict((var_name, var_sexp_vector) for ...) dataframe = robjects.r('data.frame')(**d)
どちらも目立ったスピードアップは得られませんでした。
DataFrame オブジェクトがコンストラクターで rinterface.SexpVector を取得できることに気付いたので、そのような名前付きベクターを作成することを考えましたが、名前を入れる方法がわかりません (RI では、名前だけを知っています(vec) = c('a','b'...))。
それ、どうやったら出来るの?別の方法はありますか?また、ボトルネックがどこにあるかを知ることができるように、rpy 自体をプロファイリングする簡単な方法はありますか?
編集:
次のコードは、新しい rpy (2.2.3) でうまく動作するようです (x4 高速)。
data = ro.r('list')([ri.FloatSexpVector(x) for x in vectors])[0]
data.names = ri.StrSexpVector(vector_names)
ただし、R は名前を使用できないように見えるため、バージョン 2.0.8 (Windows でサポートされている最後のバージョン) にはありません:「eval(expr、envir、enclos) のエラー: オブジェクト 'y' が見つかりません」
アイデア?
編集#2: 誰かがWindows用のrpy2.3バイナリ(python 2.7)を構築するという素晴らしい仕事をしました。言及されたものはそれでうまく機能します(私のコードではほぼx6高速です)
リンク: https://bitbucket.org/breisfeld/rpy2_w32_fix/issue/1/binary-installer-for-win32