为什么预分配对列表有用?

2024-04-24

我知道预分配向量或矩阵很有用,因为它们始终存储在连续的内存块中。

然而,就列表而言,它可以包含不同长度和模式的元素。所以我的第一个猜测是列表可能只包含指向其元素真实地址的指针。我对么?这里有一个相关问题列表的内部实现是怎样的? https://stackoverflow.com/questions/16129068/what-is-the-internal-implementation-of-lists它说列表本质上是一个数组,但它没有涵盖元素如何存储在列表中,而每个元素的大小可能会改变。

示例 1:如果列表包含a,b,c,d,e, 什么时候myList$a<-1:1000000,是就地修改的列表(这意味着仅a已更新)还是复制并更新整个列表?

实施例2

> system.time( { myList <- list()
+                myList$a <- 1:10000000
+                myList$b <- 1:10000100
+                myList$c <- 1:10000200 
+                myList$d <- 1:10000300})
   user  system elapsed 
   0.01    0.02    0.03

> system.time({ myList2<-list(a=1:10000000,b=1:10000100,c=1:10000200,d=1:10000300) })
   user  system elapsed 
   0.00    0.03    0.03 

would myList相比之下效率非常低myList2由于没有预分配?或者无论多大,根本没有明显的性能差异a,b,c,d是因为第一个只复制指针几次?

这里涉及到预分配。列表看起来怎么样?它只为指针预分配内存吗?如果是这样的话,我看不到任何用处,因为无论如何都不会有太多的指针数据复制。

> system.time( { myList <- vector("list", 4)
+                myList[[1]] <- 1:10000000
+                myList[[2]] <- 1:10000100
+                myList[[3]]  <- 1:10000200 
+                myList[[4]] <- 1:10000300
+                names(myList) <- letters[1:4]})
   user  system elapsed 
   0.01    0.02    0.03 

对于评论来说这太长了——但不是完整的答案。

在修改时的复制方面,命名列表与未命名列表的处理方式不同。

复印(对于大型物体)

这是一个复杂的问题。看http://radfordneal.wordpress.com/2013/07/02/fixing-rs-named-problems-in-pqr/ http://radfordneal.wordpress.com/2013/07/02/fixing-rs-named-problems-in-pqr/以获得合理的解释,并注意其中一些更改正在 R 的开发版本中实现。另请参阅http://r.789695.n4.nabble.com/Confused-about-NAMED-td4103326.html http://r.789695.n4.nabble.com/Confused-about-NAMED-td4103326.html为了更多地了解潜在的复杂性

以下是预分配的各种可能性的一些时机

# preallocated contents so timing is list related only
.a <- seq_len(1e6); .b <- seq_len((1e6 + 1))
.c <- seq_len((1e6 + 2)); .d <- seq_len((1e6 + 3))



f1 <- function(){
# using `$<-` empty list
  x <- list()
  x$a <- .a
  x$b <- .b
  x$c <- .c 
  x$d <- .d
  x
}


f2 <- function(){
  # using `[[<-` on empty list
  x <- list()
  x[['a']] <- .a
  x[['b']] <- .b
  x[['c']] <- .c
  x[['d']] <- .d
  x
}


f3 <- function(){
  # using `[[<-` on empty list, naming later
  x <- list()
  x[[1]] <- .a
  x[[2]] <- .b
  x[[3]] <- .c
  x[[4]] <- .d
  names(x) <- letters[1:4]
  x
}

f4 <- function(){ 
  # just define the list
  x <- list(a = .a, b = .b,
            c = .c, d = .d)
}


f5 <- function(){ 
  # create a list of length 4, then fill and name
  x <- vector(mode = 'list', length = 4)
  x[[1]] <- .a
  x[[2]] <- .b
  x[[3]] <- .c
  x[[4]] <- .d
  names(x) <- letters[1:4]
  x
}

# f6 <- function(){
#  # this doesn't work!
#  # it creates a list of length 8
#  x <- vector(mode = 'list', length = 4)
#  x[['a']] <- .a
#  x[['b']] <- .b
#  x[['c']] <- .c
#  x[['d']] <- .d
#  x
# }


f7 <-function(){
# pre allocate list, name then fill
x <- vector(mode = 'list', length = 4)
  names(x) <- letters[1:4]
  x[[1]] <- .a
  x[[2]] <- .b
  x[[3]] <- .c
  x[[4]] <- .d
  x
}

f8 <- function(){
# preallocate correct length and then name
# and fill by name
  x <- vector(mode = 'list', length = 4)
  names(x) <- letters[1:4]
  x[['a']] <- .a
  x[['b']] <- .b
  x[['c']] <- .c
  x[['d']] <- .d
  x
}

library(microbenchmark)
microbenchmark(f1(),f2(),f3(),f4(),f5(),f7(),f8(),times=100)


microbenchmark(f1(),f2(),f3(),f4(),f5(),f7(),f8(),times=100)
# Unit: microseconds
#   expr      min       lq   median       uq       max neval
#   f1()    6.038   11.169   12.980   14.791    34.110   100
#   f2() 2528.881 4387.962 4707.014 6472.823 74586.266   100
#   f3() 2532.805 4537.376 4714.258 5353.722 74903.206   100
#   f4() 2475.756 4531.489 4721.503 6331.860 74460.395   100
#   f5() 2508.959 4512.474 4759.535 6673.551  7966.668   100
#   f7() 2545.181 4477.761 4709.127 6372.610  7964.856   100
#   f8() 2508.053 4467.799 4669.131 6181.993 74236.726   100
#
#  All results are identical.
all(identical(f1(),f2()),identical(f1(),f3()),
    identical(f1(),f4()),identical(f1(),f5()),
    identical(f1(),f7()),identical(f1(),f8()))

# [1] 正确

所有结果都是相同的。

显然,在空列表上使用 $

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

为什么预分配对列表有用? 的相关文章

  • 在 r 中导出矩阵

    我想在 R 中导出一个矩阵 并保留行和列的名称 当我使用 write table 或 write csv 时 我得到一个带有新列的矩阵 我该如何使用这个功能 感谢您的帮助 您不会获得新列 行名称将保存为文本文件中的第一列 因此 您可以指定在
  • par(mfrow=c(1,2)) 不显示并排密度图[重复]

    这个问题在这里已经有答案了 par mfrow c 1 2 plot 1 12 log y plot 1 2 xaxs i 然而 当我尝试做并排密度图时 图会单独输出 load the stud recs dataset library U
  • R中添加水印

    我在用magickR中的库 我想在一些图片上添加水印 I used image annotate功能如下 img lt image read C Users Maydin Desktop manzara png image annotate
  • R::bigmemory - 如何创建角色big.matrix?

    我尝试使用bigmemory封装在R我一开始就陷入困境 我愿意 temp lt matrix paste a 1 10 5 2 并得到一个字符矩阵 没关系 但后来我尝试 x lt as big matrix temp type char 我
  • 重复测量引导统计数据,按多个因素分组

    我有一个看起来像这样的数据框 但显然还有更多行等 df lt data frame id c 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 cond c A A B B A A B B A A B B A A B B co
  • 如何删除箱线图上的刻度线

    我试图从箱线图中删除 x 轴刻度线 但保留与刻度线关联的标签 这在基础 R 中可能吗 colors lt c lightskyblue3 gray78 gold1 wheat1 boxplot avgscore module data mi
  • 正则表达式字符串中第一个和最后一个非点的位置

    我希望找到字符串的第一个和最后一个非点元素的位置 理想情况下我想这样做regex在基地R 我已经写过R解决问题的代码 不过 我对一个感兴趣regex解决方案 感谢您的任何建议 这是一个示例数据集和R代码以获得所需的结果 此代码拆分字符串并使
  • 在 R 中向散点图添加线条

    如何向图表添加线条 我做了以下 dat lt data frame xvar 1 20 rnorm 20 sd 10 yvar 1 20 rnorm 20 sd 10 zvar 1 20 rnorm 20 sd 10 plot dat 1
  • 使用 pracma::findpeaks 识别持续峰值

    我的语法有问题peakpat内的选项findpeaks内的函数pramcaR 包 v 2 1 1 我使用的是 R 3 4 3 x64 Windows 我希望该函数能够识别可能有两个重复值的峰值 并且我相信该选项peakpat这就是我能做到的
  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • kernlab 中 SVM 训练之外的核矩阵计算

    我正在开发一种新算法 该算法可以生成修改后的核矩阵以用于 SVM 训练 但遇到了一个奇怪的问题 出于测试目的 我比较了使用 kernelMatrix 接口和普通内核接口学习的 SVM 模型 例如 Model with kernelMatri
  • 在 R 中绘制 Likert 变量的堆积条形图

    假设我有一个如下所示的数据框 P Q1 Q2 1 1 4 1 2 2 3 4 3 1 1 4 其中的列告诉我哪个人相应地回答了问题 q1 q2 中的哪一个 这些问题需要按照 4 分李克特量表进行回答 例如 批准 表示 1 稍微批准 表示 2
  • 为什么 dplyr filter() 不能在函数内工作(即使用变量作为列名)?

    使用 dplyr 函数对数据进行过滤 分组和变异的函数 基本管道序列在函数之外工作得很好 这就是我使用真实列名称的地方 将其放入一个函数中 其中列名称是一个变量 并且某些函数可以工作 但有些函数则不能 尤其是 dplyr filter 例如
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • 在 R 格子包中微调点图

    我正在尝试为不同的数据集和不同的算法绘制一堆 ROC 区域 我有三个变量 方案 指定所使用的算法 数据集 是正在测试算法的数据集 以及 Area under ROC 我正在 R 中使用lattice库 命令如下 点图 方案 Area und
  • 以引用透明的方式从函数的省略号参数中提取符号

    事情又发生了 我正要按下发布答案按钮的问题被删除了 我正在寻找一种方法来从函数的省略号参数中提取绑定到符号的对象的值以及符号 也就是说 我试图以引用透明的方式从省略号中提取符号 我尝试过使用替代品和lazy dots 但没有成功 funct
  • 使用 R 选择第一个非 NA 值

    df lt data frame ID c 1 1 1 2 3 3 3 test c NA 5 5 6 4 NA 7 3 NA 10 9 我想创建一个名为 value 的变量 它是每个单独 ID 测试的第一个非 NA 值 对于只有NA的个体
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • 将阴影区域添加到五分位数之间的直方图中

    All 我有一个包含 2 个直方图的图表 其中我还绘制了代表第 20 40 60 和 80 个百分位数的线条 下面的代码使用虚拟数据重现了类似的图表 data lt rbind data frame x rnorm 1000 0 1 g o
  • 更改闪亮 R 中的默认浏览器

    我在 RStudio 中使用 01 hello 虽然在 IE 中默认打开程序时它不会显示直方图 但即使在 Chrome 中 滑块也不起作用 我无法滑动条形图并看到直方图中的变化 如何更改 R 中的默认浏览器 以便闪亮启动 Chrome 而不

随机推荐

  • Cookie 中缺少安全属性:WL_PERSISTENT_COOKIE 和 testcookie

    在安全扫描结果中 我收到以下错误 WL PERSISTENT COOKIE 和 testcookie 的 加密会话 SSL Cookie 中缺少安全属性 我不知道如何为这些 cookie 设置安全属性 从 websphere 服务器它只允许
  • 枚举DataFlow脚本组件中的RecordSet作为数据源

    这是一个 SSIS 相关问题 我有一个设置为对象类型的变量 一个数据流将一些过滤的行导入到记录集中 并且该记录集存储在对象变量中 在完全独立的数据流中 我需要使用该记录集作为源 所以我创建了一个脚本组件并告诉它它将是一个数据源 我将其设置为
  • 将本地脚本文件添加到 EJS 视图

    我有一个 Node Express EJS 应用程序 它有一个用于视图的文件夹和另一个用于客户端文件的文件夹 后者有另一个 javascript 文件夹 其中有一个名为 frontend js 的文件 我想在此视图中加载 jQuery 和
  • 从 32 位拖放到 64 位

    我正在编写一个接受文件拖放的 C 程序 当它以 32 位编译时 它在任何情况下都可以工作 但当它以 64 位编译时 它仅适用于从 64 位应用程序拖动的文件 32 位 gt 32 位 成功 64 位 gt 64 位 成功 64 位 gt 3
  • 将命令发送到 GNU 屏幕

    我有一个名为 demo 的 GNU 屏幕 我想向它发送命令 我该怎么做呢 screen S demo X home aa scripts outputs sh yeilds No screen session found 和做screen
  • 如何判断一个类是否有成员变量?

    Problem 我想检测一个类是否有成员变量 如果有 则静态断言失败 就像是 struct b int a static assert has member variables b Class should not contain memb
  • 自定义 DataGridView 每次构建时都会添加列

    我正在写一个继承DataGridView控制默认情况下有两列 DGV 依靠用户控制GeneralTabPanel它继承自MainTabPanel它继承自UserControl 原因是MainTabPanel包含每个继承面板都必须重写的虚拟函
  • 关键“users_email_unique”空字段的重复条目“”

    我有两种类型的用户 真实的和假的 假用户是不使用系统的员工 真实用户使用他们的电子邮件地址登录 所以我的用户迁移有 table gt string email gt unique 问题是假用户可能没有电子邮件地址 我可以添加第一个假用户 没
  • Visual Studio 找不到引用

    我正在处理另一个人移交的一些应用程序 我必须在其中记录需求 构建和部署流程 这里的问题是 Visual Studio 2005 抛出很多错误 因为它找不到 dll 的引用 这显然不会让 VS 构建该项目 在该人的计算机上一切正常 但在我的计
  • 使用 Django 进行 Jquery 自动完成

    我正在尝试在 django 应用程序中使用 jquery ui 自动完成功能搜索一些项目 我看过这个question https stackoverflow com questions 4920031 jquery autocomplete
  • Java应用程序cpu负载过高的解决办法

    今天 我发现我的服务器的cpu负载太高 并且服务器只运行一个Java应用程序 下面是我的操作步骤 I used top命令查找应用程序的 pid pid是25713 I used top H p 25713命令查找一些使用最多 cpu 的
  • 将 PNG 图像中的透明度替换为白色背景

    我有一个带有 Alpha 通道 即透明度 的 PNG 图像 我需要创建将图像层合成到白色背景上的版本 我想使用可编写脚本的命令 使用 CLI 工具 例如 Image Magick 将 PNG 直接无损地转换为 PNG 导致错误的非工作 Im
  • 命令行 Ruby 函数的手册页

    有没有办法从命令行获取 Ruby 函数的手册 像 funcR 中的手册页 The ri工具在这里可能会有所帮助 http rubylearning com satishtalim ruby ri tool html ri Array ri
  • 如何使用 CPANPLUS 自动捆绑包更新新版本的 Perl?

    我有 Perl 5 13 4 其中包含大量已安装的 CPAN 模块 我刚刚编译了 Perl 5 14 0 我想将 5 13 4 中的所有模块安装 重新编译 到 5 14 0 中 我可以 已经使用 cpanp 和 b 选项生成了已安装模块的捆
  • 在 R 中将矩阵组合成数组

    如果我创建了多个矩阵 如何将它们组合成一个数组 我有 8 个矩阵 每个矩阵有 200 行和 200 列 我需要将它们组合成一个 dim 200 200 8 的数组 所以我希望每个矩阵都是数组的一部分 您可以使用abind函数从abind包裹
  • 强制构建全局对象

    代码如下 struct S S debugbreak static const S g s 显然 我希望一些代码在启动时运行 这仅适用于某些具有外部代码引用的符号的源文件 对于静态库中没有任何从外部引用的符号的源文件 看起来编译器或链接器会
  • 如何声明带有值的 ArrayList? [复制]

    这个问题在这里已经有答案了 Java 中的 ArrayList 或 List 声明 https stackoverflow com questions 12321177 arraylist declaration java已提问并回答了如何
  • 是否可以在由同一父进程创建的两个子进程之间建立管道(LINUX,POSIX)

    我有多个孩子由同一个父母 分叉 我尝试构建pipe所有这些子进程之间的连接就像一个链表结构 孩子 1 向孩子 2 发送数据 孩子 2 向孩子 3 孩子 N 向孩子 1 发送数据 有没有正确的方法可以做到这一点 此外 如果我在进程之间创建和通
  • 为什么 JavaScript 的 parseInt 的基数默认为 8?

    在 JavaScript 的 parseInt 函数中将基数默认为 8 如果字符串以 0 开头 让我很烦恼 只是因为我仍然忘记将可选的第二个参数传递为 10 我正在寻找一个答案 告诉我为什么这样做有意义将其默认为 8 如果输入字符串以 0
  • 为什么预分配对列表有用?

    我知道预分配向量或矩阵很有用 因为它们始终存储在连续的内存块中 然而 就列表而言 它可以包含不同长度和模式的元素 所以我的第一个猜测是列表可能只包含指向其元素真实地址的指针 我对么 这里有一个相关问题列表的内部实现是怎样的 https st