如何比较Rpy2, pyrserve和PypeR



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

这三个选项的优点或缺点是什么?

我对这三个人中的一个比其他的更了解,但是按照问题给出的顺序:

rpy2:

  • Python和R之间的c级接口(R作为嵌入式进程运行)
  • R对象暴露给Python而不需要通过
  • 复制数据
  • 相反,Python的numpy数组可以暴露给R而无需复制
  • 低级接口(接近R C-API)和高级接口(方便)
  • 可以对向量和数组进行就地修改
  • R回调函数可以在Python中实现
  • 可以使用Python标签使用匿名R对象
  • Python酸洗可能
  • 完全自定义R的行为与它的控制台(因此可能实现一个完整的R GUI)
  • 有限支持的MSWindows

pyrserve:

    本地Python代码(将/应该/可能与CPython, Jython, IronPython一起工作)
  • 使用R's reserve
  • 与远程计算和RServe相关的优点和缺点

pyp:

    本地Python代码(将/应该/可能与CPython, Jython, IronPython一起工作)
  • 使用管道让Python与R通信(与它相关的优点和不便)

edit: Windows支持rpy2

来自Journal of Statistical Software on PypeR的论文:

RPy提供了一种从Python访问R的简单而有效的方法。它是坚固和非常方便Python和r之间的频繁交互操作Python程序将基本数据类型的Python对象传递给R函数并返回结果为Python对象。对于Python和R频繁交互的情况,这些特性使其成为一个有吸引力的解决方案。然而,这个包仍然有如下所列的限制。
性能:
对于大型数据集或计算密集型数据集,RPy的表现可能不是很好职责。在生成Python时不可避免地要消耗大量的时间和内存R数据的副本,因为在对话的每一轮中,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因其不经济地使用内存而受到谴责。大-所使用的内存size R对象在被删除后很少被释放。有时唯一的从R中释放内存的方法是退出R。RPy模块将R封装在一个Python对象中。然而,即使Python对象被删除,R库也会保留在内存中。在其他在主机Python脚本终止之前,R使用的内存不会被释放。
可移植性:
作为一个用C语言编写扩展的模块,RPy源包必须被编译在POSIX (Unix的可移植操作系统接口)上使用特定的R版本系统,并且R必须在启用共享库的情况下编译。还有二进制Windows的发行版绑定到不同版本的特定组合Python/R,所以用户很难找到一个是用户的软件环境。

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

在pyper中,我不能通过assign()将大矩阵从python传递到R实例。然而,我对rpy2没有问题。这只是我的经验。

相关内容

  • 没有找到相关文章

最新更新