【问题标题】:Translation from Python to R. Big difference in execution time从 Python 到 R 的翻译。执行时间差异很大
【发布时间】:2020-03-15 12:41:45
【问题描述】:

我正在将一段代码从 Python 转换为 R,以在总和重复时定位一系列数字的位置。翻译对我来说是一对一的,但是与需要大约一个小时的 R 代码相比,python 代码的执行时间不到一秒钟。我想知道我是否遗漏了两种语言的数据结构中的任何内容。为什么执行代码的时间差这么大?当我在 R 中编写以下 Python 代码时,有什么更好或更有效的选择?

Python:

def calculate(data):
    found = set([0])
    total = 0
    while True:
        for num in data:
            total = total + num
            if total in found:
                return total
            else:
                found.add(total)

R:

calculate <- function(input) {
  found = set(0)
  total = 0
  while (TRUE) {
   for (num in input) {
     total = total + num
     if (total %in% found) {               
         return(total)
     } else {
         found <- c(found, total)
     }
    }
  }
}

【问题讨论】:

  • 与许多语言不同,R 通常在矢量化操作中至少一点更好,而不是将它们展开到 for 循环中(许多,也许大多数语言在 @ 987654325@ 循环)。我看到的大多数问题都声称 R 的最新版本在 for 循环中的表现非常糟糕,这些问题的代码效率极低,或者受到迭代绑定或 R 的引用语义的惩罚。
  • R 代码中的set 来自哪里?
  • @SamMason,set 来自这个包:rdocumentation.org/packages/sets/versions/1.0-18/topics/set。我没有在上面的代码中包含它。
  • 通常,在 R 中,您不必使用循环。您必须拆分问题并将每个子问题与 R 中的函数匹配。在您的示例中,您可以使用 R 的内置 cumsum。
  • @FannieY 你能举一个小例子来说明执行时间的差异,也许还能解释这个算法的要点吗?我尝试过的几个例子要么立即停止,要么发散,我看不出它会如何停止

标签: python r for-loop while-loop vectorization


【解决方案1】:

猜测这是 R 中大多数不可变事物的组合(因此向量连接每次都会分配新对象)和 R 的 %in% 运算符为 O(N),而 in 为 O( 1) 在 Python 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2018-06-20
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多