我正在使用 rpy2 包为 python 带来一些 R 功能。我在 R 中使用的函数需要一个 data.frame 对象,通过使用 rlike.TaggedList 和 robjects.DataFrame 我能够完成这项工作。
但是,当与具有完全相同数据的完全相同的 R 函数进行比较时,我遇到了性能问题,这导致我尝试使用此处提到的 rpy2 低级接口 - http://rpy.sourceforge.net/rpy2/ doc-2.3/html/performances.html
到目前为止,我已经尝试过:
- 将 TaggedList 与 FloatSexpVector 对象而不是 numpy 数组和 DataFrame 对象一起使用。
使用这样的字典转储 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)
但是它不在版本 2.0.8(Windows 支持的最后一个版本)上,因为 R 似乎无法使用名称:“eval 中的错误(expr,envir,enclos):找不到对象'y'”
想法?
编辑#2: 有人为windows(python 2.7)构建了一个rpy2.3二进制文件做得很好,提到的效果很好(我的代码几乎快x6)
链接:https ://bitbucket.org/breisfeld/rpy2_w32_fix/issue/1/binary-installer-for-win32