每个作业是否都意味着要进行复制?

时间:2019-04-15 21:31:01

标签: r optimization reference copy

最近我了解到R中没有引用,而是所有对象都是不可变的,并且每个赋值都会产生一个副本。

嗯。

一遍又一遍地复制大型矩阵似乎很可怕...

现在,我一直处于偏执状态,因为我害怕制作辅助函数(传递参数=赋值?返回值=赋值?),所以一直都在复制代码,如果我愿意,我害怕制作辅助变量。不是100%肯定会复制对象...

示例:

我想做的事

foo = function(someGivenLargeObject) {
    returnedMatrix = someGivenLargeObject$someLargeMatrix # <- BAD?!?!?!?!
    if(someCondition)
        returnedMatrix = operateOn(returnedMatrix)
    if(otherCondition)
        returnedMatrix = operateOn(returnedMatrix)
    returnedMatrix
}

我正在做什么:

foo = function(someGivenLargeObject) { # <- still BAD?!?!?!
    returnedMatrix = NULL # <- No copy of someLargeMatrix is made!
    if(someCondition)
        returnedMatrix = operateOn(someGivenLargeObject$someLargeMatrix)
    if(otherCondition)
        returnedMatrix = operateOn(
            if(is.null(returnedMatrix)) 
                someGivenLargeObject$someLargeMatrix
            else
                returnedMatrix
        ) # <- ^ Incredible clutter! Unreadable!
    if(is.null(returnedMatrix))
        return(someGivenLargeObject$someLargeMatrix)
    else
        return(returnedMatrix) # <- does return copy stuff?!?!?!?!

该功能的第二个版本中的可读性损失非常惊人。但是-这样的价格是否可以避免在someLargeMatrixsomeCondition都不成立的情况下不必要地复制otherCondition?因为行returnedMatrix = someGivenLargeObject$someLargeMatrix需要复制吗?

或者我处于偏执状态,我是否可以安全地使用该功能的更具可读性的版本,因为无需引用someLargeMatrix就可以进行复制? (但是R中没有引用!!!)

我还希望函数调用/函数返回也不会复制内容?     }

侧面注释:显然,这是很清楚的:在我如上所述的情况下,我不必要地复制对象时,我还没有遇到问题。读完“ R中没有引用”后,我感到很困惑,所以这个问题是基于我对缺少引用的隐含含义的担忧,而不是任何经验观察。

1 个答案:

答案 0 :(得分:0)

唐纳德·努斯(Donald Knuth)有句著名的话:“过早的优化是万恶之源”,

http://wiki.c2.com/?PrematureOptimization

意识到这一点很高兴,但是在大多数情况下,代码的清晰性更为重要。 R通常足够聪明,可以确定何时需要复制。 (并非所有分配都会导致仅复制分配,以后会被修改)