R:监视矢量化操作的进度

时间:2016-06-09 17:42:46

标签: r loops vectorization

是否可以在R中监控矢量化操作的进度?例如。在循环中,可以始终if (i %% 10000) print(i)查看代码当前正在处理的元素。我的直觉是,#34;可能不是",但可能是我错了?

1 个答案:

答案 0 :(得分:4)

在我的评论中,我询问了您的代码是什么以及如何实现矢量化。我觉得这很重要。虽然一般来说,矢量化是通过在编译代码中使用循环来实现的,但我并不完全确定。因此,我不太自信地说'#34;绝对没有"。

但是,如果要跟踪R级别的进度,则必须能够获得索引,例如在R级i循环中使用的for。现在,让我们检查大多数R矢量化函数的样子:

> grep
function (pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, 
    fixed = FALSE, useBytes = FALSE, invert = FALSE) 
{
    if (!is.character(x)) 
        x <- structure(as.character(x), names = names(x))
    .Internal(grep(as.character(pattern), x, ignore.case, value, 
        perl, fixed, useBytes, invert))
}
<bytecode: 0xa34dfe0>
<environment: namespace:base>

> gsub
function (pattern, replacement, x, ignore.case = FALSE, perl = FALSE, 
    fixed = FALSE, useBytes = FALSE) 
{
    if (!is.character(x)) 
        x <- as.character(x)
    .Internal(gsub(as.character(pattern), as.character(replacement), 
        x, ignore.case, perl, fixed, useBytes))
}

   

在上面的例子中,我们看到那些向量化的R函数只是编译代码的一个薄包装器(参见.Internal())。没有明确的循环索引供您参考。因此,对于这些示例功能,跟踪进度是不可能的。

我建议您查看您使用的特定功能。这是说服自己的最佳方式。

跟进

最初,我在我的示例中添加了lapply

> lapply
function (X, FUN, ...) 
{
    FUN <- match.fun(FUN)
    if (!is.vector(X) || is.object(X)) 
        X <- as.list(X)
    .Internal(lapply(X, FUN))
}
<bytecode: 0x9c5c464>
<environment: namespace:base>

然后@RichardScriven表达了他对*apply家庭的看法。在堆栈溢出时,这两个帖子/答案对于理解R中的向量化问题非常有用:

但是,虽然lapply调用C代码来执行循环,但它必须在循环中评估R函数FUN。因此:

  • 如果FUN占据执行时间,那么lapply将不会比R for循环具有明显的优势。
  • 如果FUN做得很少,那么循环开销在执行中占主导地位,那么lapply将比R for循环有明显的优势,因为{{1} C中的循环更多&#34;轻量级&#34;。

在这篇文章中讨论for的性能是偏离主题的,所以我不会附上演示示例。