4

rpy2 パッケージを使用して、いくつかの R 機能を Python に導入しています。私が R で使用している関数には data.frame オブジェクトが必要であり、rlike.TaggedList を使用してから robjects.DataFrame を使用することで、これを機能させることができます。

ただし、まったく同じR関数とまったく同じデータを比較すると、パフォーマンスの問題が発生するため、ここで説明したようにrpy2低レベルインターフェイスを試して使用するようになりました - http://rpy.sourceforge.net/rpy2/ doc-2.3/html/performances.html

これまでのところ、私は試しました:

  1. numpy 配列の代わりに FloatSexpVector オブジェクトと DataFrame オブジェクトで TaggedList を使用します。
  2. 次のような辞書を使用して、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

4

1 に答える 1

1

Python は R (バイト コンパイルされた R でさえも) よりも数倍高速である可能性があり、rpy2 を使用して R よりも高速に R データ構造の操作を実行することができました。関連する R と rpy2 のコードを共有することは、より具体的なアドバイスを行うのに役立ちます (必要に応じて rpy2 を改善します)。

それまでの間、SexpVector はあなたが望むものではないかもしれません。これは、すべての R ベクトルの抽象クラスにすぎません ( rpy2.rinterface のクラス図を参照してください)。ListSexpVectorより適切かもしれません:

import rpy2.rinterface as ri
ri.initr()
l = ri.ListSexpVector([ri.IntSexpVector((1,2,3)),
                       ri.StrSexpVector(("a","b","c")),])

重要な詳細は、R リストは再帰的なデータ構造であり、R は演算子 "[[" ("[" に加えて) を使用することで catch 22 タイプの状況を回避することです。Python にはそれがなく、私は (まだ?) "[[" を低レベルのメソッドとして実装していません。

Python でのプロファイリングは、たとえばモジュール stdlib モジュール cProfile を使用して実行できます。

于 2012-07-17T17:17:29.943 に答える