4

我正在使用 rpy2 包为 python 带来一些 R 功能。我在 R 中使用的函数需要一个 data.frame 对象,通过使用 rlike.TaggedList 和 robjects.DataFrame 我能够完成这项工作。

但是,当与具有完全相同数据的完全相同的 R 函数进行比较时,我遇到了性能问题,这导致我尝试使用此处提到的 rpy2 低级接口 - http://rpy.sourceforge.net/rpy2/ doc-2.3/html/performances.html

到目前为止,我已经尝试过:

  1. 将 TaggedList 与 FloatSexpVector 对象而不是 numpy 数组和 DataFrame 对象一起使用。
  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)

但是它不在版本 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

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 回答