哪种提取方法最快?

雅各布

给定清单

li = list(a = list(b = list(1:3)))

以下提取方法得出的结果相同:

li[["a"]][["b"]][[1]][[2]]
[1] 2

purrr::pluck(li, "a", "b", 1, 2)
[1] 2

for (i in list("a", "b", 1, 2)) li = `[[`(li, i)
li
[1] 2

purrr::pluck并且for具有明显的优势,即可以通过编程构造嵌套索引的向量。在以下方面进行比较时,有什么要考虑的因素:

  • 性能(例如,“链接”[[方法与该for方法有显着不同/更快吗?)
  • 边缘情况,其中一种方法可能提供与其他方法不同的结果
r2evans

虽然我不确切地知道,问“哪种方法最快”“不仅是执行速度”是什么意思如果您指的是渐近性能,那么也许我们可以对列表进行一些测试。(如果您是指代码优雅,惯用性或其他含义,那么也许这不是最明确的问题。)

我有第四个建议:

Reduce(`[[`, list('a','b',1L,2L), init=li)

性能比较:

microbenchmark::microbenchmark(
  base = li[["a"]][["b"]][[1]][[2]],
  purrr = purrr::pluck(li, "a", "b", 1, 2),
  "for" = { li0 <- li; for (i in list("a", "b", 1, 2)) li0 = `[[`(li0, i)}, 
  reduce = Reduce(`[[`, list('a', 'b', 1L, 2L), init=li)
)
# Unit: microseconds
#    expr    min      lq     mean  median      uq    max neval
#    base    1.5    2.65    3.747    3.60    4.95    8.9   100
#   purrr   33.9   62.00   73.727   67.70   91.90  159.1   100
#     for 2716.7 3465.65 4671.615 5120.05 5353.00 6090.2   100
#  reduce    9.6   18.60   23.519   21.50   28.10   73.5   100

让我们尝试一个更大的list

gargantuan <- setNames(1:2600, paste0(rep(LETTERS, times=100), rep(1:100, each=26)))
li = c(gargantuan, list(a = c(gargantuan, list(b = list(1:3)))))
li[["a"]][["b"]][[1]][[2]]
# [1] 2
### other tests confirm the results are identical

# Unit: microseconds
#    expr    min      lq     mean  median      uq    max neval
#    base   35.8   74.85  132.272  142.85  194.35  211.4   100
#   purrr  102.2  210.60  313.105  354.00  396.80  519.4   100
#     for 2151.8 3082.55 4338.619 4744.00 5354.95 5841.4   100
#  reduce   40.8   94.00  160.764  177.80  223.45  239.5   100

这表明该Reduce解决方案仅以文字/常量基础版本为佳,而对于编程的,健壮的解决方案,Reducepurrr::pluck要比for循环快一点,并且两个循环都比循环

(注意:我说的是指基本的索引方法,而不是防错或类似方法,它很健壮。它容易受到用户过度索引的影响,因此,更具弹性的方法可能包括预索引检查和/或错误捕获。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

提取图案的最快方法

来自分类Dev

我应该使用哪种方法(最快)选择元素?

来自分类Dev

哪种最快的方法求和两个范围?

来自分类Dev

提取子序列序列的最快方法

来自分类Dev

使用Python提取tar文件的最快方法

来自分类Dev

从HBase提取数据的最快方法是什么

来自分类Dev

有多少种方法可以将元素添加到列表中,哪种方法最快?

来自分类Dev

哪种方法是在c中获取数组切片的最快方法?

来自分类Dev

从byte []中提取宽度可变的有符号整数的最快方法

来自分类Dev

用Java提取大写字符的最快方法

来自分类Dev

从 numpy 矩阵中删除/提取子矩阵的最快方法

来自分类Dev

向Oracle添加许多(UDF)验证功能-哪种方法运行最快

来自分类Dev

在Python中提取和清理HTML正文文本的最快,最无错误的方法是什么?

来自分类Dev

从给定日期提取日期,月份和年份的最快方法是什么?

来自分类Dev

1次I / O传递中以numpy提取和字典的最快方法

来自分类Dev

Oracle:使用SQL或PL / SQL提取文件扩展名的最快方法

来自分类Dev

从外部数据库中提取数据的最快方法是什么

来自分类Dev

IBM DB2 ver 09.09.006按组或不按组提取数据的最快方法(性能)

来自分类Dev

从R中的n对中提取k个不同元素的最快方法

来自分类Dev

用C从8个不同的字节中提取8位的最快方法是什么?

来自分类Dev

从给定索引数组的Python列表中提取子列表的最快方法

来自分类Dev

从给定日期提取日期,月份和年份的最快方法是什么?

来自分类Dev

将数据从Doc或Pdf提取到电子表格的最快方法

来自分类Dev

从一系列熊猫时间戳中提取月份的最快方法

来自分类Dev

1次I / O传递中以numpy提取和字典的最快方法

来自分类Dev

提取列然后在大分隔文件中找到其uniq项的最快方法

来自分类Dev

一次从光栅中提取所有波段的最快方法(python/gdal)

来自分类Dev

扩展序列的最快方法

来自分类Dev

修改结构的最快方法

Related 相关文章

  1. 1

    提取图案的最快方法

  2. 2

    我应该使用哪种方法(最快)选择元素?

  3. 3

    哪种最快的方法求和两个范围?

  4. 4

    提取子序列序列的最快方法

  5. 5

    使用Python提取tar文件的最快方法

  6. 6

    从HBase提取数据的最快方法是什么

  7. 7

    有多少种方法可以将元素添加到列表中,哪种方法最快?

  8. 8

    哪种方法是在c中获取数组切片的最快方法?

  9. 9

    从byte []中提取宽度可变的有符号整数的最快方法

  10. 10

    用Java提取大写字符的最快方法

  11. 11

    从 numpy 矩阵中删除/提取子矩阵的最快方法

  12. 12

    向Oracle添加许多(UDF)验证功能-哪种方法运行最快

  13. 13

    在Python中提取和清理HTML正文文本的最快,最无错误的方法是什么?

  14. 14

    从给定日期提取日期,月份和年份的最快方法是什么?

  15. 15

    1次I / O传递中以numpy提取和字典的最快方法

  16. 16

    Oracle:使用SQL或PL / SQL提取文件扩展名的最快方法

  17. 17

    从外部数据库中提取数据的最快方法是什么

  18. 18

    IBM DB2 ver 09.09.006按组或不按组提取数据的最快方法(性能)

  19. 19

    从R中的n对中提取k个不同元素的最快方法

  20. 20

    用C从8个不同的字节中提取8位的最快方法是什么?

  21. 21

    从给定索引数组的Python列表中提取子列表的最快方法

  22. 22

    从给定日期提取日期,月份和年份的最快方法是什么?

  23. 23

    将数据从Doc或Pdf提取到电子表格的最快方法

  24. 24

    从一系列熊猫时间戳中提取月份的最快方法

  25. 25

    1次I / O传递中以numpy提取和字典的最快方法

  26. 26

    提取列然后在大分隔文件中找到其uniq项的最快方法

  27. 27

    一次从光栅中提取所有波段的最快方法(python/gdal)

  28. 28

    扩展序列的最快方法

  29. 29

    修改结构的最快方法

热门标签

归档