for 循环和 apply 函数系列之间的性能差异是什么?

2024-03-11

人们常说,一个人应该更喜欢lapply over for循环。 但也有一些例外,例如 Hadley Wickham 在他的 Advance R 书中指出的那样。

(http://adv-r.had.co.nz/Functionals.html http://adv-r.had.co.nz/Functionals.html)(就地修改、递归等)。 以下是其中的一个案例。

只是为了学习,我尝试以函数形式重写感知器算法,以便进行基准测试 相对性能。 来源 (https://rpubs.com/FaiHas/197581 https://rpubs.com/FaiHas/197581).

这是代码。

# prepare input
data(iris)
irissubdf <- iris[1:100, c(1, 3, 5)]
names(irissubdf) <- c("sepal", "petal", "species")
head(irissubdf)
irissubdf$y <- 1
irissubdf[irissubdf[, 3] == "setosa", 4] <- -1
x <- irissubdf[, c(1, 2)]
y <- irissubdf[, 4]

# perceptron function with for
perceptron <- function(x, y, eta, niter) {

  # initialize weight vector
  weight <- rep(0, dim(x)[2] + 1)
  errors <- rep(0, niter)


  # loop over number of epochs niter
  for (jj in 1:niter) {

    # loop through training data set
    for (ii in 1:length(y)) {

      # Predict binary label using Heaviside activation
      # function
      z <- sum(weight[2:length(weight)] * as.numeric(x[ii, 
        ])) + weight[1]
      if (z < 0) {
        ypred <- -1
      } else {
        ypred <- 1
      }

      # Change weight - the formula doesn't do anything
      # if the predicted value is correct
      weightdiff <- eta * (y[ii] - ypred) * c(1, 
        as.numeric(x[ii, ]))
      weight <- weight + weightdiff

      # Update error function
      if ((y[ii] - ypred) != 0) {
        errors[jj] <- errors[jj] + 1
      }

    }
  }

  # weight to decide between the two species

  return(errors)
}

err <- perceptron(x, y, 1, 10)

### my rewriting in functional form auxiliary
### function
faux <- function(x, weight, y, eta) {
  err <- 0
  z <- sum(weight[2:length(weight)] * as.numeric(x)) + 
    weight[1]
  if (z < 0) {
    ypred <- -1
  } else {
    ypred <- 1
  }

  # Change weight - the formula doesn't do anything
  # if the predicted value is correct
  weightdiff <- eta * (y - ypred) * c(1, as.numeric(x))
  weight <<- weight + weightdiff

  # Update error function
  if ((y - ypred) != 0) {
    err <- 1
  }
  err
}

weight <- rep(0, 3)
weightdiff <- rep(0, 3)

f <- function() {
  t <- replicate(10, sum(unlist(lapply(seq_along(irissubdf$y), 
    function(i) {
      faux(irissubdf[i, 1:2], weight, irissubdf$y[i], 
        1)
    }))))
  weight <<- rep(0, 3)
  t
}

由于上述原因,我并没有预期会有任何持续的改进 问题。但尽管如此,当我看到病情急剧恶化时,我还是感到非常惊讶 使用lapply and replicate.

我使用以下方法得到了这个结果microbenchmark函数来自microbenchmark library

可能是什么原因? 会不会是内存泄漏?

                                                      expr       min         lq       mean     median         uq
                                                        f() 48670.878 50600.7200 52767.6871 51746.2530 53541.2440
  perceptron(as.matrix(irissubdf[1:2]), irissubdf$y, 1, 10)  4184.131  4437.2990  4686.7506  4532.6655  4751.4795
 perceptronC(as.matrix(irissubdf[1:2]), irissubdf$y, 1, 10)    95.793   104.2045   123.7735   116.6065   140.5545
        max neval
 109715.673   100
   6513.684   100
    264.858   100

第一个函数是lapply/replicate功能

第二个是函数for loops

第三个是相同的功能C++ using Rcpp

这里根据 Roland 的功能分析。 我不确定我能以正确的方式解释它。 在我看来,大部分时间都花在子集化上函数分析 https://i.stack.imgur.com/N2Nez.png


首先,这是一个早已被揭穿的神话for循环比任何慢lapply. The forR 中的循环性能得到了提高,目前至少与lapply.

也就是说,你必须重新考虑你的使用lapply这里。您的实现需要分配给全局环境,因为您的代码要求您在循环期间更新权重。这是不考虑的正当理由lapply.

lapply是一个您应该使用的函数,因为它有副作用(或没有副作用)。功能lapply自动将结果合并到列表中,并且不会扰乱您的工作环境,这与for环形。同样适用于replicate。另请参阅这个问题:

R 的 apply 系列不仅仅是语法糖吗? https://stackoverflow.com/questions/2275896/is-rs-apply-family-more-than-syntactic-sugar

原因是你的lapply解决方案要慢得多,是因为您使用它的方式会产生更多开销。

  • replicate只不过是sapply在内部,所以你实际上结合了sapply and lapply来实现你的双循环。sapply会产生额外的开销,因为它必须测试结果是否可以简化。所以一个for循环实际上比使用更快replicate.
  • 在你的里面lapply匿名函数,您必须为每个观察访问 x 和 y 的数据帧。这意味着 - 与你的 for 循环相反 - 例如函数$每次都必须调用。
  • 由于您使用这些高端函数,因此与您的“lapply”解决方案相比,您的“lapply”解决方案调用了 49 个函数for只调用 26 的解决方案。这些额外的函数lapply解决方案包括调用类似的函数match, structure, [[, names, %in%, sys.call, duplicated, ... 您不需要的所有功能for循环,因为该循环不执行任何这些检查。

如果你想知道这个额外的开销从何而来,请查看内部代码replicate, unlist, sapply and simplify2array.

您可以使用以下代码来更好地了解您在何处失去性能lapply。一行一行地运行!

Rprof(interval = 0.0001)
f()
Rprof(NULL)
fprof <- summaryRprof()$by.self

Rprof(interval = 0.0001)
perceptron(as.matrix(irissubdf[1:2]), irissubdf$y, 1, 10) 
Rprof(NULL)
perprof <- summaryRprof()$by.self

fprof$Fun <- rownames(fprof)
perprof$Fun <- rownames(perprof)

Selftime <- merge(fprof, perprof,
                  all = TRUE,
                  by = 'Fun',
                  suffixes = c(".lapply",".for"))

sum(!is.na(Selftime$self.time.lapply))
sum(!is.na(Selftime$self.time.for))
Selftime[order(Selftime$self.time.lapply, decreasing = TRUE),
         c("Fun","self.time.lapply","self.time.for")]

Selftime[is.na(Selftime$self.time.for),]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

for 循环和 apply 函数系列之间的性能差异是什么? 的相关文章

  • 将绘图调用拆分为多个块

    我正在编写一个图的解释 其中我基本上将在第一个块中创建图 然后描述该输出 并在第二个块中添加一个轴 然而 似乎每个块都会强制一个新的绘图环境 因此当我们尝试使用以下命令运行块时会出现错误axis独自的 观察 output html docu
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • R 中的列乘以子字符串

    假设我有一个数据框 其中包含多个组件及其在多个列中列出的属性 并且我想对这些列运行多个函数 我的方法是尝试将其基于每个列标题中的子字符串 但我无法弄清楚如何做到这一点 下面是数据框的示例 Basket F Type 1 F Qty 1 F
  • 在 R 中使用 lapply 绘制多个数据帧

    我正在尝试使用 lapply 函数绘制多个数据帧 每个数据帧一个图 但是尽管有关此主题的所有帖子我都找不到答案 因为我不断收到错误 图的输出列表为空 我的数据结构如下 df1 lt mtcars gt group by cyl gt tal
  • 基于时间窗口的不规则时间序列的优化滚动函数

    有没有办法使用 rollapply 来自zoo包或类似的东西 优化功能 rollmean rollmedian等 使用基于时间的窗口计算滚动函数 而不是基于大量观察的函数 我想要的很简单 对于不规则时间序列中的每个元素 我想计算一个具有 N
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou
  • 如何获得所有大于x且有位置的数字?

    V lt c 1 3 2 4 2 3 1 X lt 3 pos lt V V X pos is 3 3 我需要的是所有 3 个的位置 I need 2 and 6 哪些职位是3 in V Use which pos lt which V 3
  • 如何在 R 或 Python 中制作旭日图?

    到目前为止 我一直无法找到一个可以创建旭日图的 R 库约翰 斯塔斯科 http www cc gatech edu gvu ii sunburst 有人知道如何在 R 或 Python 中实现这一点吗 在极坐标投影中使用 matplotli
  • jQuery mousemove 性能 - 节流事件?

    我们面临着与 mousemove 连接的 jQuery 事件传播性能问题 我们有一个屏幕填充画布 需要跟踪用户是否在其上拖动鼠标 因此我们在该对象上添加了一个鼠标移动侦听器 如下所示 ourCanvas on mousemove funct
  • 如何从 R 中的 txt 文件读取矩阵?

    我有一个带有矩阵的txt文件 Matrix txt 重要 数字之间没有空格 0100 1001 1100 我想在 R 中将其作为矩阵读取 我该怎么做 我尝试使用 as matrix read table Matrix txt sep 但失败
  • 使用 enum.values() 与字符串数组相比,性能是否会受到影响?

    我正在使用枚举来替换String我的 java 应用程序 JRE 1 5 中的常量 当我在不断调用的方法中将枚举视为名称的静态数组时 例如 在渲染 UI 时 是否会对性能造成影响 我的代码看起来有点像这样 public String get
  • 如何使用 SparkR 1.6.0 写入 JDBC 源?

    使用 SparkR 1 6 0 我可以使用以下代码从 JDBC 源读取数据 jdbc url lt jdbc mysql localhost 3306 dashboard user
  • R“错误:“}”中出现意外的“}”[重复]

    这个问题在这里已经有答案了 我有一个字符串变量 对于缺少数据的情况 它具有 空值 我想将 空值 重新编码为缺失 而不是说 空值 我正在尝试编写一个循环来删除这些 空值 条目 但我不断收到错误 错误 中出现意外的 for row in dat
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • 实三次多项式的最快数值解?

    R 问题 寻找最快的方法来数值求解一堆已知具有实系数和三个实根的任意三次方程 据报道 R 中的 polyroot 函数对复杂多项式使用 Jenkins Traub 算法 419 但对于实多项式 作者参考了他们早期的工作 对于实三次或更一般的
  • 如何绘制具有显着性水平的箱线图?

    前段时间问了一个关于绘制箱线图的问题Link1 https stackoverflow com questions 14604439 plot multiple boxplot in one graph 我有一些包含 3 个不同组 或标签
  • 麦当劳 omega:R 中的警告

    我正在计算几种不同尺度的欧米茄 并在 R 中使用不同的 omega 函数获取不同比例的不同警告消息 我的问题是如何解释这些警告以及报告检索到的 omega 统计数据是否安全 当我使用 从 alpha 到 omega 内部一致性估计普遍问题的
  • 在 Shiny 中的用户会话之间共享反应数据集

    我有一个相当大的反应数据集 该数据集是通过轮询文件然后按预定义的时间间隔读取该文件而派生的 数据更新频繁 需要不断重新加载 诚然 重新加载可以增量完成并附加到 R 中的现有对象 但事实并非如此 然而目前 尽管会话中的数据相同 但此操作是针对

随机推荐

  • 禁用右键单击后如何检查 chrome 中的元素?

    我想调试一个信息框 当我将鼠标悬停在谷歌地图标记上时显示该信息框 但谷歌地图禁用右键单击地图画布上的任何位置 因此我无法检查该元素以进行调试 查看目的 我尝试通过元素选项卡中的 href 内容搜索元素 但它没有显示在搜索中 尽管缺少右键单击
  • Oracle“创建表为”空值

    如果您使用 create as 创建一个 Oracle 表 其中某个字段为空 您将收到错误 ORA 01723 不允许零长度列 查询示例 create table mytable as select field a null brand n
  • 架构 i386 的重复符号[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • jQuery 背景位置动画

    我创建了一个图像 它基本上是由 3 个图像组成的 CSS 精灵 它的大小是 278x123 所以它们基本上是 3 个 278x41 的图像 我想做的是通过改变背景位置来制作动画 我尝试了很多方法 我的一个不太有效的解决方案如下 var sl
  • Java/Mysql..SQLException:表必须至少有 1 列 SQLState:42000 VendorError:1113

    我有一个连接到数据库的应用程序 如果名称尚不存在 则创建一个表 并添加新的注册用户信息 以便我可以将密码散列到我的登录框架 并将它们与数据库进行匹配也将被散列 目前我有以下错误代码 SQLException A table must hav
  • 用类隐藏

    我确信这真的很简单 但这对我来说不起作用 我编写了一个表单 允许用户使用标签从列表中选择一个月
  • Python/WebApp Google App Engine - 测试标头中的用户/通行证

    当您像这样调用网络服务时 username test12 password test34 client httplib2 Http cache client add credentials username password URL htt
  • 检查 UTF-8 字符串在 Qt 中是否有效

    在 Qt 中 有没有办法检查字节数组是否是有效的 UTF 8 序列 看起来QString fromUtf8 http qt project org doc qt 5 0 qtcore qstring html fromUtf8默默地抑制或替
  • jQuery UI 自动完成中的自定义属性问题

    我在使用 jQuery UI 的自动完成功能时遇到了自定义属性的问题 由于某些奇怪的原因 自动完成功能不允许我使用 make 或 id 属性ui item make or ui item id 但在设置为时工作ui item label H
  • Typescript:如何期望精确的类实例作为函数参数

    Code 考虑以下代码 一个基类 两个子类 以及一个采用一个子类的一个实例的函数 abstract class AbstractNumberHolder constructor private readonly value number g
  • 使用 Jackson 从 POJO 创建 JSON 模式时,从 JSON 模式中删除“id”

    如何去掉id字段 id urn jsonschema org gradle 人 来自使用 Jackson 创建的 JSON 模式 生成的模式 type object id urn jsonschema org gradle Person p
  • 未捕获的类型错误:未定义不是 WordPress 中的函数(匿名函数)[重复]

    这个问题在这里已经有答案了 我收到以下错误 这似乎是 Javascript 未解释 符号 未捕获的类型错误 未定义不是函数 main js 1 匿名函数 main js 1 下面附加的是 main js 代码 这在某个时候工作得很好 我正在
  • BrowserSync Gulp 无法在 Chrome 中打开

    我尝试在 Chrome 中使用 BrowserSync 和 Gulp 在本地主机上打开我的网站 但它不起作用 默认情况下 它在 Firefox 中打开 一切正常 但是 当我更改 gulpfile js 中的参数以在 Chrome 中打开网站
  • iOS7 上的 TableViewCell 中不会显示复选标记

    我现在正在研究一个奇怪的问题 我的应用程序部署目标设置为 iOS6 因此我想同时支持 iOS6 和 iOS7 我只有一个简单的 UITableView 用户可以在其中选择首选的通知声音 代码为 UITableViewCell tableVi
  • 预测 git Push 中将推送多少数据

    我偶尔会使用昂贵的互联网连接 并且我想知道 至少大约 有多少数据将被推送到远程git push 事实上 我想我很喜欢我的评论 可以将其作为答案发布 当您推送时 git 会创建一个包含所有必需对象的包并将其上传到远程 这意味着我们正在寻找一种
  • 将 less 和 css 文件捆绑在一起

    我觉得捆绑应该用于将一堆一起使用的文件分组到一个交付给浏览器的文件中 这意味着对于我的根样式 我想做类似以下的事情 var bundle new StyleBundle Content style Include Content mysty
  • 网格/列表视图的概念如何将图像发送到 imageitem 类

    在我的项目中 我想加载 url 图像并在 gridview 活动中显示它们 但如何将这些图像加载到 gridview 适配器呢 所以我试图理解这个概念grid list view适配器 据我了解 在一个基本示例中 它包含 3 个活动 1 主
  • Doctrine 2 QueryBuilder 添加多个选择元素/参数?

    我仍在与 QueryBuilder 学说作斗争 因为当我想将另一个元素添加到选择表达式中时 我认为它无法正常工作 在这两种情况下 学说 queryBuilder gt getQuery gt getResults 返回一个数组 其中实体表示
  • 如何将不存在的链接重定向到 Angular 2 中的主页?

    如果用户输入不存在的链接 我希望页面重定向到主页 我该怎么做 谢谢 RouteConfig path home name Home component HomeComponent path about name About componen
  • for 循环和 apply 函数系列之间的性能差异是什么?

    人们常说 一个人应该更喜欢lapply over for循环 但也有一些例外 例如 Hadley Wickham 在他的 Advance R 书中指出的那样 http adv r had co nz Functionals html htt