gpt4 book ai didi

r - 为什么矢量化速度更快

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

我已经学习 R 一段时间了,并且遇到了很多关于像我这样的编程类型来向量化操作的建议。作为一名程序员,我对为什么/如何更快感兴趣。一个例子:

n = 10^7
# populate with random nos
v=runif(n)
system.time({vv<-v*v; m<-mean(vv)}); m
system.time({for(i in 1:length(v)) { vv[i]<-v[i]*v[i] }; m<-mean(vv)}); m

这给了
   user  system elapsed 
0.04 0.01 0.07
[1] 0.3332091

user system elapsed
36.68 0.02 36.69
[1] 0.3332091

需要考虑的最明显的事情是我们正在运行 native 代码,即从 C 或 C++ 编译的机器代码,而不是解释代码,如两个示例之间用户时间的巨大差异(大约 3 个数量级)所示。但是还有其他事情吗?例如,R 是否执行:
  • 狡猾的原生数据结构,例如存储稀疏向量或矩阵的巧妙方法,以便我们只在需要时才进行乘法运算?
  • 惰性求值,例如在矩阵乘法中,直到需要时才评估单元格。
  • 并行处理。
  • 别的东西。

  • 为了测试是否可能存在一些稀疏向量优化,我尝试使用不同向量内容进行点积
    # populate with random nos
    v<-runif(n)
    system.time({m<-v%*%v/n}); m
    # populate with runs of 1 followed by 99 0s
    v <-rep(rep(c(1,rep(0,99)),n/100))
    system.time({m<-v%*%v/n}); m
    # populate with 0s
    v <-rep(0,n)
    system.time({m<-v%*%v/n}); m

    然而,时间上没有显着差异(大约过去了 0.09)

    (Matlab 的类似问题: Why does vectorized code run faster than for loops in MATLAB?)

    最佳答案

    The most obvious thing to consider is that we're running native code, i.e. machine code compiled from C or C++, rather than interpreted code



    这就是大部分。另一个重要的组成部分是,由于 R 代码在其设计范式中是功能性的,因此函数(尝试)没有副作用,这意味着在某些(但可能不是全部;R 确实尝试对此进行高效处理)实例调用 [<-在 for 循环侧导致必须复制整个对象。这可能会变慢。

    一个小的旁注:R 确实具有相当广泛的处理功能 sparse矩阵结构有效,但它们不是“默认”。

    关于r - 为什么矢量化速度更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16902902/

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