在Django中预加载Importr

时间:2013-10-20 17:30:10

标签: django rpy2

有没有办法为rpy2会话的R实例预加载库?在进口商调用格子或grdevices时,我花费了25-30%的响应时间(每个图表大约0.5秒),并且如果可能的话,我希望减少。

代码段:

grdevices = importr('grDevices')
importr('lattice')

imagefile = File(open('1d_%s.png' % str(uuid4()), 'w'))
grdevices.png(file=imagefile.name, type='cairo',width=400,height=350)

rcmd="""
print(
    xyplot(yvec~xvec,labels=labels,type=c('p','r'),
            ylab='%s',xlab='%s'
            )
)"""% (y_lab, x_lab)
robjects.r(rcmd)
grdevices.dev_off()

imagefile.close()

如果我不调用importr(“lattice”),robjects.r会对我后来制作的“xyplot(...”调用事件感到不满。我可以使用R_PROFILE或R_ENVIRON_USER加速格子和grdevices调用吗?

1 个答案:

答案 0 :(得分:1)

importr是一个非常高级别的功能,易于使用的交易性能。除了加载R包之外,它还有很多功能。它还将该包中的所有R对象映射到Python(rpy2)对象。如果未使用结果,则在脚本中执行importr('lattice')时会失去这种努力。

除此之外,在R中导入包本身并非没有成本(对于具有S4类定义的较大R包,当脚本很短时,这可能是显而易见的)。 rpy2对此无能为力。

可以使用R_PROFILE之类的R变量,但默认情况下不会在very recently之前启用。如何启用它是在SO(here)。

现在,importr只占“响应时间的25%”。专注于此的优化工作将无法使其超过25%(这是一个非常乐观的限制)。将数据插入字符串以将其评估为R代码之后不是非常优化(如documentation for rpy2中所述)。考虑通过rpy2调用R函数,将数据作为导出缓冲区接口的任何内容传递(例如)。