gpt4 book ai didi

parsing - "apply"函数的优点是什么?什么时候使用它们比 "for"循环更好,什么时候不使用?

转载 作者:行者123 更新时间:2023-12-03 21:44:24 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




10年前关闭。




Possible Duplicate:
Is R's apply family more than syntactic sugar



就像标题所说的那样。也许是个愚蠢的问题,但我的理解是,当使用“应用”函数时,迭代是在编译代码中执行的,而不是在 R 解析器中执行的。例如,这似乎意味着 lapply 仅比“for”循环快,如果有很多迭代并且每个操作都相对简单。例如,如果对封装在 lapply 中的函数的单次调用需要 10 秒,并且只有 12 次迭代,那么我可以想象使用“for”和“lapply”之间几乎没有区别。

现在我想到了,如果无论如何都必须解析“lapply”中的函数,为什么使用“lapply”而不是“for”会有任何性能优势,除非你正在做一些有编译函数的事情(如求和或乘法等)?

提前致谢!

乔希

最佳答案

人们可能更喜欢 apply 的原因有很多。家庭功能超过 for循环,反之亦然。

首先,for()apply() , sapply()如果正确执行,通常会和彼此一样快。 lapply()与其他函数相比,它在 R 内部的编译代码中执行更多操作,因此可以比这些函数更快。当“循环”数据的行为是计算时间的重要部分时,速度优势似乎最大;在许多一般的日常使用中,您不太可能从本质上更快的 lapply() 中获益。 .最后,这些都将调用 R 函数,因此它们需要被解释然后运行。
for()循环通常更容易实现,特别是如果您具有循环流行的编程背景。在循环中工作可能比强制迭代计算进入 apply 之一更自然。家庭功能。但是,要使用 for()循环正确,您需要做一些额外的工作来设置存储并管理将循环的输出再次插入到一起。 apply函数会自动为您执行此操作。例如。:

IN <- runif(10)
OUT <- logical(length = length(IN))
for(i in IN) {
OUT[i] <- IN > 0.5
}

那是 例如 >是一个矢量化运算符,但我想说明一点,即您必须管理输出。最主要的是,与 for()循环,你 总是 在开始循环之前分配足够的存储空间来保存输出。如果您不知道需要多少存储空间,则分配一个合理的存储块,然后在循环中检查您是否已用完该存储空间,然后再添加一大块存储空间。

在我看来,使用 apply 之一的主要原因函数系列用于更优雅、可读的代码。与其管理输出存储和设置循环(如上所示),我们可以让 R 处理它并简洁地要求 R 在我们的数据子集上运行一个函数。速度通常不会影响决定,至少对我来说。我使用最适合情况的函数,将生成简单易懂的代码,因为如果我不记得代码是什么,我总是选择最快的函数,因此浪费的时间比节省的时间要多得多做一天或一周或更长时间!
apply族适合于标量或向量运算。一个 for()循环通常有助于使用相同的索引进行多次迭代操作 i .例如,我编写了使用 for() 的代码。循环对对象进行 k 折或引导交叉验证。我可能永远不会喜欢用 apply 之一来做这件事。族,因为每次 CV 迭代都需要多次操作,访问当前帧中的大量对象,并填充几个保存迭代输出的输出对象。

至于最后一点,为什么 lapply()可能比 for() 更快或 apply() ,您需要意识到“循环”可以在解释的 R 代码或编译的代码中执行。是的,两者仍然会调用需要解释的 R 函数,但是如果您正在执行循环并直接从编译的 C 代码(例如 lapply() )调用,那么性能增益可以来自于 apply()说这归结为 for()在实际的 R 代码中循环。查看 apply() 的来源看到它是 for() 的包装器循环,然后查看 lapply() 的代码,即:
> lapply
function (X, FUN, ...)
{
FUN <- match.fun(FUN)
if (!is.vector(X) || is.object(X))
X <- as.list(X)
.Internal(lapply(X, FUN))
}
<environment: namespace:base>

你应该明白为什么 lapply() 之间的速度会有差异和 for()和另一个 apply家庭功能。 .Internal()是 R 调用 R 本身使用的已编译 C 代码的方法之一。除了对 FUN 的操作和健全性检查之外,整个计算是用C完成的,调用R函数 FUN .将其与 apply() 的来源进行比较.

关于parsing - "apply"函数的优点是什么?什么时候使用它们比 "for"循环更好,什么时候不使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com