【问题标题】:Improve Runtime for calling R function in python function using rpy2使用 rpy2 改进在 python 函数中调用 R 函数的运行时
【发布时间】:2019-08-29 15:26:08
【问题描述】:

我主要使用 python 编程(使用 jupyter notebooks),但有时需要使用 R 函数。我目前通过使用 rpy2 和 R 魔法来做到这一点,效果很好。现在我想编写一个函数,它将我的分析过程的一部分总结到一个包装函数中(所以我并不总是需要运行所有的代码单元,而是可以简单地执行一次函数)。作为此过程的一部分,我需要调用 R 函数。我修改了我的代码,使用带有 importr 的 rpy2.robjects 接口将 R 函数导入 python。这可行,但速度极慢(对于已经很长的过程来说,运行时间是三倍以上),这使得这在分析方面根本不可行。我假设这与我通过 rpy2 的高级接口而不是低级接口访问 R 有关。我不确定如何在函数调用中使用低级接口,并且需要一些帮助来调整我的代码。

我尝试查看 rpy2 文档,但很难理解它。

这是我在 python 中使用 R 魔法执行 R 函数调用的代码。

激活 rpy2 R 魔法

%load_ext rpy2.ipython

加载我需要的库

%%R

library(scran)

实际调用R函数

%%R -i data_mat -i input_groups -o size_factors

size_factors = computeSumFactors(data_mat, clusters=input_groups, min.mean=0.1)

这是我使用 rpy2 importr 导入 R 函数的替代代码。

from rpy2.robjects.packages import importr
scran = importr('scran')
computeSumFactors = scran.computeSumFactors
size_factors = computeSumFactors(data_mat, clusters=input_groups, min_mean=0.1)

由于某种原因,第二种方法要慢几个数量级。 任何帮助将不胜感激。

【问题讨论】:

  • 我遇到了同样的问题,导入语句很慢。奇怪的是,当我在 Python 控制台中运行 importr 语句时,它比使用 python 脚本运行时要快。

标签: python rpy2


【解决方案1】:

我认为对观察执行速度有影响的两者之间的唯一区别是转换。

在“R 魔法”代码单元(前缀为 %%R)中运行时,在您的示例中,调用 computeSumFactors() 的结果是绑定到 R 中符号 size_factors 的 R 对象。在另一种情况下,在结果绑定到 Python 符号 size_factors 之前,调用函数 computeSumFactors() 的结果将通过转换系统(具体发生的情况取决于您拥有的活动转换器)。

转换可能代价高昂:您应该考虑尝试停用 numpy / pandas 转换(localconverter 上下文管理器可能是一种方便的方法,可以暂时对代码块使用最少的转换)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2014-10-19
    • 2016-01-15
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多