2012-07-17 38 views
4

我正在使用rpy2軟件包將一些R功能引入python。 我在R中使用的函數需要一個data.frame對象,並使用rlike.TaggedList,然後使用robjects.DataFrame,我可以使這個工作。在python中用低級別rpy2創建R data.frame

但是我有性能問題,具有完全相同的數據,這使我嘗試使用rpy2低層次接口這裏提到比較完全相同的R裏面的函數時 - 到目前爲止http://rpy.sourceforge.net/rpy2/doc-2.3/html/performances.html

我已嘗試:

  1. 使用TaggedList與FloatSexpVector對象而不是numpy數組和DataFrame對象。
  2. 通過使用字典這樣轉儲TaggedList和數據框類:

    d = dict((var_name, var_sexp_vector) for ...) 
    dataframe = robjects.r('data.frame')(**d) 
    

兩人都沒有得到我任何明顯的加速。我已經注意到DataFrame對象可以在它們的構造函數中獲得一個rinterface.SexpVector,所以我曾想過創建一個這樣的命名向量,但我不知道如何放入名稱(在RI中知道它的正義名稱(vec)= c('a','b'...))。

我該怎麼做?有另一種方法嗎? 有沒有簡單的方法來分析rpy本身,所以我可以知道瓶頸在哪裏?

編輯:

下面的代碼似乎在較新的RPY工作的偉大(X4更快)(2.2.3)

data = ro.r('list')([ri.FloatSexpVector(x) for x in vectors])[0] 
data.names = ri.StrSexpVector(vector_names) 

但是它不能在2.0.8版本(最後一個由windows支持),因爲R似乎不能夠使用以下名稱:「eval(expr,envir,enclos)中的錯誤:未找到對象'y'」

想法?

編輯#2: 有人做建設rpy2.3二進制的Windows(Python 2.7版)的精細作業,所提到的(我的代碼幾乎快5233)的偉大工程與它

鏈接: https://bitbucket.org/breisfeld/rpy2_w32_fix/issue/1/binary-installer-for-win32

+0

最新發布的rpy2是2.2.6。不要使用2.0.8,不管原因。 – lgautier 2012-07-18 18:54:50

回答

1

Python可能比R更快幾倍(即使是字節編譯的R),並且我設法用Rpy2對R數據結構執行的操作比R要快。共享相關的R和rpy2代碼將有助於提出更具體的建議(並在需要時改進rpy2)。

在此期間,SexpVector可能不是你想要的;它僅僅是所有R向量的抽象類(參見class diagram for 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由具有操作者避免了鎖釦22型的情況「[[」(在addittion到「[」 )。 Python沒有,我還沒有(尚未?)實現「[[」作爲低級別的方法。例如,可以使用模塊stdlib模塊cProfile完成Python中的分析。

+1

非常感謝您的回答。我知道cProfile ofcourse,我是要求最簡單的方法來剖析rpy的c-extension部分。 關於解決方案的兩個問題 - 第一個在我的Windows機器上,我使用的是舊的rpy,它沒有ListSexpVector,第二個 (在我的linux機器上測試),它似乎不工作,因爲我的數據是FloatSexpVectors的列表,我從R運行時錯誤「參數意味着不同的行數」 – itai 2012-07-18 10:44:14

+0

今天檢查rpy2郵件列表。有一個鏈接到Win7最近的rpy2的貢獻版本。 – lgautier 2012-07-18 18:50:59

+0

這是個好消息!我已經在爲自己做這件事了,這讓我省了很多工作......謝謝你們的支持! – itai 2012-07-19 11:34:50