rpy2代码求值方法的区别

2024-10-02 12:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

rpy2可以用两种不同的方法计算R代码:

方法A-将字符串计算为R代码

import rpy2.robjects as rob
rcode = '''
print(summary(mtcars))
'''
rob.r(rcode)

方法B-通过python对象计算R代码

import rpy2.robjects as rob
rsummary = rob.r['summary']
mtcars = rob.r('mtcars')
print rsummary(mtcars)

rpy2 documentation警告不要使用方法A,因为“对大型对象执行此操作可能不是对计算能力的最佳利用。“为什么?是否有已知的基准?你知道吗

我更喜欢方法A,因为它对我来说更容易理解,它使两种语言保持分离,而且我可以只填充现有的R代码片段。然而,我想知道更多关于我将要牺牲什么,走这条路。对此有任何见解都将不胜感激。你知道吗


Tags: 对象方法字符串代码importdocumentationassummary
1条回答
网友
1楼 · 发布于 2024-10-02 12:29:33

如果您在python中没有任何数据,这一切都归结为处理数据,请务必使用方法A

方法A相当于使用子进程运行R。想象一下,使用python创建一个文件script.R,然后运行该脚本,在开始处理大量数据之前,这一切都可以正常工作。你知道吗

举个例子:

from rpy2 import robjects as ro
import numpy
data = numpy.random.random(1000)

现在在python中有了一个包含1000个元素的向量,如果你想在R中使用它,你必须转换它。您的方法A将产生如下结果:

vecstr = "c({})".format(",".join(map(str, data)))
cmd = 'hist({},xlab="val", ylab="count", main="")'.format(vecstr)
ro.r(cmd)

其中len(cmd)>15000。最好将所有内容都写入一个文件,然后单独调用R脚本(如上所述,使用python的subprocessing模块)。或者,您可以这样做,如方法B:

ro.r.hist(ro.FloatVector(data), xlab="val", ylab="count", main="")

如果向量的长度是100万而不是1000,那么它就不会有问题。你知道吗

关于效率问题:

In [29]: data1 = numpy.random.random(1000)

In [30]: data2 = numpy.random.random(1000)

In [31]: %%timeit
   ....: ro.r.cor(ro.FloatVector(data1), ro.FloatVector(data2))[0]
   ....: 
1000 loops, best of 3: 1.01 ms per loop

In [32]: %%timeit
   ....: vec1str = "c({})".format(",".join(map(str, data1)))
   ....: vec2str = "c({})".format(",".join(map(str, data2)))
   ....: ro.r("cor({},{})".format(vec1str, vec2str))
   ....: 
100 loops, best of 3: 5.86 ms per loop

对于一个简单的玩具示例,它没有做很多工作,而且数据集相对较小,不转换为字符串的速度似乎要快5-6倍。你知道吗

相关问题 更多 >

    热门问题