Rpy2,pyrserve和PypeR如何比较?
我想从一个Python程序中访问R. 我知道Rpy2,pyrserve和PypeR。
这三个选项有什么优点或缺点?
我知道其中三个比其他人好,但是按照问题中给出的顺序:
rpy2:
- Python和R之间的C级接口(R作为embedded式进程运行)
- R对象暴露给Python,而不需要复制数据
- 相反,Python的numpy数组可以暴露给R而不需要复制
- 低级接口(靠近R C-API)和高级接口(为了方便)
- 可以对向量和数组进行就地修改
- Rcallback函数可以用Python实现
- 可能有一个Python标签的匿名R对象
- Python酸洗可能
- 用控制台完全定制R的行为(所以可以实现完整的R GUI)
- MSWindows支持有限
pyrserve:
- 本地Python代码(将/应该可以与CPython,Jython,IronPython一起使用)
- 使用R的Rserve
- 与远程计算和RServe相关的优点和不便
pyper:
- 本地Python代码(将/应该可以与CPython,Jython,IronPython一起使用)
- 使用pipe道使Python与R进行通信(与其相关的优点和不便)
编辑: Windows支持rpy2
来自PypeR统计软件杂志的论文 :
RPy提供了一个从Python访问R的简单有效的方法。 这对于Python和R之间频繁的交互操作是健壮的和便利的。这个包允许Python程序将基本数据types的Python对象传递给R函数,并将结果返回给Python对象。 对于Python和R频繁交互的情况,这样的特性使其成为一个有吸引力的解决scheme。 但是,下面列出了这个软件包的限制。
性能:
对于大型数据集或计算密集型任务,RPy可能performance不佳。 在生成R数据的Python副本时,不可避免地消耗了大量时间和内存,因为在每一次对话中,RPy都会将Rexpression式的返回值转换为基本types或NumPy数组的Python对象。 最近开发的RPy分支RPy2使用Python对象来引用R对象,而不是将它们复制回Python对象。 这一策略避免了频繁的数据转换,提高了速度。 但是,内存消耗仍然是一个问题。 […]当我们实施一个用于微arrays数据分析的在线平台WebArray(Xia et al。2005)时,如果通过RPy运行R,而不是通过R的命令行用户界面,则工作消耗大约四分之一的计算时间。 因此,我们决定在随后的开发中通过pipe道运行R,例如WebArrayDB(Xia et al。2009),它保持了与独立运行R时相同的性能。 我们不知道这种性能差异的确切原因,但是我们注意到RPy直接使用R的共享库来运行R脚本。 相反,通过pipe道运行R意味着直接运行R解释器。
记忆:
R被斥为不经济地使用记忆。 大型R对象使用的内存在删除这些对象后很less被释放。 有时从R中释放内存的唯一方法是退出R. RPy模块将R封装在Python对象中。 但是,即使Python对象被删除,R库也将保留在内存中。 换句话说,在主机Python脚本终止之前,R所使用的内存不能被释放。
可移植性:
作为使用C语言编写的扩展模块,RPy源代码包必须在POSIX(Unix操作系统接口)系统上使用特定的R版本进行编译,并且R必须在启用共享库的情况下编译。 此外,Windows的二进制发行版也绑定了不同版本的Python / R的特定组合,所以用户很难find用户软件环境的发行版。
在pyper中,我不能通过assign()将大型matrix从python传递给r实例。 不过,我没有rpy2的问题。 这只是我的经验。
从开发者的angular度来看,我们曾经使用rpy / rpy2为我们基于Python的应用程序提供统计和绘图function。 它在交付我们的应用程序时造成了很大的问题,因为rpy / rpy2需要为Python和R的特定组合进行编译,这使得我们不能提供除了捆绑R之外的二进制分发。 由于rpy / rpy2并不是特别容易安装,我们最终用本地Python模块(如matplotlib)replace了相关的部分。 如果我们必须使用R,我们可能会切换到pyrserve,因为我们可以在本地启动一个R服务器并连接到它,而不用担心R的版本。