【发布时间】: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