Rpy2,pyrserve和PypeR如何比较?

Dan*_*anB 56 python r rpy2 pyrserve pyper

我想从Python程序中访问R. 我知道Rpy2,pyrserve和PypeR.

这三种选择有哪些优点或缺点?

lga*_*ier 36

我知道其中一个比其他人好,但按照问题中给出的顺序:

rpy2:

  • Python和R之间的C级接口(作为嵌入式进程运行的R)
  • 暴露给Python的R对象无需复制数据
  • 相反,Python的numpy数组可以在不进行复制的情况下暴露给R
  • 低级接口(接近R C-API)和高级接口(为方便起见)
  • 可以对矢量和数组进行就地修改
  • R回调函数可以用Python实现
  • 可以使用带有Python标签的匿名R对象
  • Python可以腌制
  • 通过其控制台完全自定义R的行为(因此可以实现完整的R GUI)
  • MSWindows支持有限

pyrserve:

  • 原生Python代码(将/应该/可以与CPython,Jython,IronPython一起使用)
  • 使用R的Rserve
  • 与远程计算和RServe相关的优点和不便

pyper:

  • 原生Python代码(将/应该/可以与CPython,Jython,IronPython一起使用)
  • 使用管道让Python与R通信(具有与之相关的优点和不便)

编辑: Windows支持rpy2


Hen*_*rik 16

来自PypeR统计软件期刊的论文:

RPy提供了一种从Python访问R的简单而有效的方法.它非常强大,非常方便Python和R之间的频繁交互操作.这个包允许Python程序将基本数据类型的Python对象传递给R函数,并在Python对象中返回结果.这些特性使其成为Python和R频繁交互的案例的有吸引力的解决方案.但是,如下所列,此包装仍有局限性.
性能:
对于大型数据集或计算密集型任务,RPy可能表现不佳.在生成R数据的Python副本时不可避免地消耗了大量的时间和内存,因为在每次会话中,RPy将R表达式的返回值转换为基本类型或NumPy数组的Python对象.RPy2是最近开发的RPy分支,它使用Python对象来引用R对象,而不是将它们复制回Python对象.此策略可避免频繁的数据转换并提高速度.但是,内存消耗仍然是一个问题.[...]当我们实施WebArray(Xia et al.2005),一个用于微阵列数据分析的在线平台时,如果通过RPy而不是通过R的命令行用户界面运行R,则作业消耗大约四分之一的计算时间.因此,我们决定在后续开发中通过管道在Python中运行R,例如WebArrayDB(Xia et al.2009),它保持了与独立运行R时相同的性能.我们不知道这种性能差异的确切原因,但我们注意到RPy直接使用R的共享库来运行R脚本.相反,通过管道运行R意味着直接运行R解释器.
记忆:
R因其不经济的记忆使用而受到谴责.删除这些对象后,很少释放大型R对象使用的内存.有时从R释放内存的唯一方法是退出R. RPy模块将R包装在Python对象中.但是,即使删除了Python对象,R库也将保留在内存中.换句话说,在主机Python脚本终止之前,R使用的内存无法释放.
可移植性:
作为具有用C编写的扩展的模块,RPy源包必须在POSIX(Unix的可移植操作系统接口)系统上使用特定的R版本进行编译,并且必须在启用共享库的情况下编译R.此外,Windows的二进制发行版绑定了不同版本的Python/R的特定组合,因此用户很难找到用户软件环境的发行版.

  • 不确定这是一个无偏见的比较.可能是我会以相反的方式偏向于平衡然后;-).除了rpy和rpy2之间可能存在的混淆(整个文本中名称发生变化)之外,实现特异性(C vs pure R)在我看来是唯一有效的点.内存使用的所谓问题导致无法明确调用垃圾收集(某些内容)已知发生在Python).有很多例子可以证明pyper消耗更多的内存(按设计)和数量级更慢. (7认同)

use*_*347 7

从开发人员的角度来看,我们过去使用 rpy/rpy2 为基于 Python 的应用程序提供统计和绘图功能。它在交付我们的应用程序时造成了巨大的问题,因为 rpy/rpy2 需要针对 Python 和 R 的特定组合进行编译,这使得我们无法提供开箱即用的二进制发行版,除非我们也捆绑 R。由于 rpy/rpy2 不是特别容易安装,因此我们最终用 matplotlib 等原生 Python 模块替换了相关部分。如果我们必须使用 R,我们会切换到 Pyrserve,因为我们可以在本地启动 R 服务器并连接到它,而不必担心 R 的版本。


小智 5

在pyper中,我无法使用assign()将大矩阵从python传递到r实例。不过,我对 rpy2 没有任何问题。这只是我的经验。