代码之家  ›  专栏  ›  技术社区  ›  nalzok granmirupa

写入树递归的预分配向量

  •  0
  • nalzok granmirupa  · 技术社区  · 6 年前

    考虑这个简单的树递归

    tree.recursion <- function(n)
        if (n == 0) {
            numeric(0)
        } else if (n %% 2 == 0) {
            c(tree.recursion(n / 2),
              tree.recursion(n / 2))
        } else {
            c(tree.recursion(n %/% 2),
              n,
              tree.recursion(n %/% 2))
        }
    
    (ans <- tree.recursion(42))
    

    c 执行起来要花很多时间,所以我尝试了另一个使用 list unlist 成为我的瓶颈。我想问题在于R的内存管理。

    tree.recursion <- function(n)
        if (n == 0) {
            numeric(0)
        } else if (n %% 2 == 0) {
            list(tree.recursion(n / 2),
                 tree.recursion(n / 2))
        } else {
            list(tree.recursion(n %/% 2),
                 n,
                 tree.recursion(n %/% 2))
        }
    
    (ans <- unlist(tree.recursion(42)))
    

    numeric(42) 在不创建新对象的情况下写入?请注意,在我的实际应用程序中,类似的函数是一个热点,因此我不介意您是否必须使用一些肮脏的黑客来加快速度。

    0 回复  |  直到 6 年前
        1
  •  1
  •   minem    6 年前

    对不起,我看不到 c numeric(0) NULL .

    tree.recursion3 <- function(n) {
      if (n == 0) {
        return(NULL)
      } else {
        if (n %% 2 == 0) {
          x <- tree.recursion3(n / 2)
          return(c(x, x))
        } else {
          y <- tree.recursion3(n %/% 2)
          return(c(y, n, y))
        }
      }
    }
    
    p <- 2e6
    system.time(x1 <- tree.recursion(p)) # 4.5 - 5.2
    system.time(x2 <- unlist(tree.recursion2(p))) # 6 - 7.8
    system.time(x3 <- tree.recursion3(p)) # 0.04
    all.equal(x1, x2) # TRUE
    all.equal(x1, x3) # TRUE