Rpy2、pyrserve和PypeR如何比较?
我想在一个Python程序里使用R语言。我知道有Rpy2、pyrserve和PypeR这三种选择。
这三种选择各自有什么优缺点呢?
4 个回答
从开发者的角度来看,我们以前使用rpy/rpy2这个工具来给我们的Python应用提供统计和绘图功能。但这个工具给我们带来了很大的麻烦,因为rpy/rpy2需要针对特定的Python和R版本进行编译,这让我们很难提供一个开箱即用的应用版本,除非我们把R也打包在里面。而且,rpy/rpy2的安装并不是特别简单,所以我们最终决定用一些原生的Python模块,比如matplotlib,来替代相关功能。如果我们必须使用R的话,我们会选择pyrserve,因为这样我们可以在本地启动一个R服务器,然后连接上去,不用担心R的版本问题。
RPy提供了一种简单高效的方法,让Python可以访问R。它非常稳定,适合Python和R之间频繁的互动操作。这个工具包允许Python程序将基本数据类型的Python对象传递给R函数,并将结果以Python对象的形式返回。这样的功能使得在Python和R频繁交互的情况下,它成为一个很有吸引力的解决方案。不过,这个工具包也有一些限制,具体如下:
性能:
对于大数据集或计算密集型的任务,RPy的表现可能不太理想。因为在每次交互中,RPy都需要将R的返回值转换成Python对象,这样会消耗很多时间和内存。RPy2是RPy的一个新分支,它使用Python对象来引用R对象,而不是将它们复制回Python对象。这个策略避免了频繁的数据转换,提高了速度。不过,内存消耗仍然是个问题。[...] 当我们在实现WebArray(Xia等,2005)这个在线微阵列数据分析平台时,如果通过RPy运行R,所需的计算时间大约比通过R的命令行界面多出四分之一。因此,在后续开发中,我们决定通过管道在Python中运行R,比如WebArrayDB(Xia等,2009),这样可以保持与独立运行R时相同的性能。我们不知道这种性能差异的确切原因,但我们注意到RPy直接使用R的共享库来运行R脚本。而通过管道运行R则意味着直接运行R解释器。
内存:
R因其不经济的内存使用而受到批评。大型R对象在删除后,所占用的内存很少会被释放。有时,释放R的内存的唯一方法是退出R。RPy模块将R封装在一个Python对象中。然而,即使Python对象被删除,R库仍会留在内存中。换句话说,R使用的内存直到主Python脚本结束时才能释放。
可移植性:
作为一个用C语言编写扩展的模块,RPy源代码包必须在POSIX(便携式操作系统接口,适用于Unix系统)系统上与特定的R版本编译,并且R必须启用共享库编译。此外,Windows的二进制发行版与不同版本的Python/R的特定组合绑定,因此用户常常会遇到很难找到适合自己软件环境的发行版的问题。
我对这三者中的一个比较了解,但按照问题中的顺序来讲:
rpy2:
- 这是一个让Python和R之间可以直接沟通的工具,R会作为一个嵌入的进程运行。
- 你可以在Python中使用R的对象,而不需要把数据复制过去。
- 反过来,Python的numpy数组也可以直接在R中使用,而不需要复制。
- 它提供了低级接口(接近R的C接口)和高级接口(为了方便使用)。
- 可以直接修改向量和数组中的数据,而不需要额外的步骤。
- 你可以在Python中实现R的回调函数。
- 可以创建没有名字的R对象,并给它们加上Python的标签。
- 支持Python的序列化功能。
- 可以完全自定义R的行为,包括它的控制台(所以可以实现完整的R图形用户界面)。
- 在Windows上支持有限。
pyrserve:
- 这是原生的Python代码(应该可以在CPython、Jython和IronPython上运行)。
- 它使用R的Rserve。
- 与远程计算和RServe相关的优缺点。
pyper:
- 也是原生的Python代码(应该可以在CPython、Jython和IronPython上运行)。
- 通过管道让Python和R进行通信,这样做有它的优缺点。
编辑:关于rpy2在Windows上的支持情况。