gpt4 book ai didi

r - 为什么对列表进行分类会减慢 lengths() 函数的速度?

转载 作者:行者123 更新时间:2023-12-03 16:26:01 24 4
gpt4 key购买 nike

我刚刚注意到通过向 class 添加一个附加标签来对列表进行分类。属性 (S3) 或定义新的父类 (S4) 会大大减慢基本 lengths()手术。

这表明我应该总是在调用 lengths() 之前取消“分类列表”的分类。 .

任何人都可以

  • 解释为什么会发生这种情况,和/或
  • 提出更好的解决方案(或解释为什么这并不重要
    因为差异在绝对值上只是微秒)。

  • 可重现的代码:
    # create a list of 1,000 elements with variable letter lengths
    mylist <- list()
    length(mylist) <- 1000
    set.seed(99)
    mylist <- lapply(mylist, function(x) sample(LETTERS, size = sample(1:100, size = 1),
    replace = TRUE))

    # create an S3 "classed" version
    mylist_S3classed <- mylist
    class(mylist_S3classed) <- c("myclass", "list")

    # create an S4 classed version
    setClass("mylist_S4class", contains = "list")
    mylist_S4classed <- new("mylist_S4class", mylist)

    # compare timings of lengths
    microbenchmark::microbenchmark(lengths(mylist),
    lengths(mylist_S3classed),
    lengths(mylist_S4classed),
    unit = "relative")
    ## Unit: relative
    ## expr min lq mean median uq max neval
    ## lengths(mylist) 1.0000 1.0000 1.0000 1.00000 1.00000 1.00000 100
    ## lengths(mylist_S3classed) 125.1433 119.3588 103.9747 91.90734 89.56034 291.97767 100
    ## lengths(mylist_S4classed) 162.4045 155.4870 119.0611 120.20908 111.95417 67.55309 100

    ## in absolute timings
    microbenchmark::microbenchmark(lengths(mylist),
    lengths(mylist_S3classed),
    lengths(mylist_S4classed))
    ## Unit: microseconds
    ## expr min lq mean median uq max neval
    ## lengths(mylist) 6.401 6.9475 9.66612 9.4620 10.577 29.237 100
    ## lengths(mylist_S3classed) 792.738 851.0895 911.97067 898.0955 939.558 1604.189 100
    ## lengths(mylist_S4classed) 1050.448 1104.7920 1293.63965 1173.4545 1229.485 6431.130 100

    最佳答案

    这个额外的时间是 R 找到正确的时间 length功能。对于一个普通的旧列表,它非常简单和优化,它可能存储在对象中。收到,退货。

    对于分类对象,无论是 S3 还是 S4,R 必须找到正确的 length函数因为 length可以定义为一种方法。所以 R 必须继续寻找,在你的情况下,它到处寻找,直到它陷入默认状态。当它完成时,它花了那些毫秒。

    除非您可以告诉 future 的自己,您永远不会写 length,否则不要尝试取消分类以尝试加快速度这些对象上的方法,因为您的代码会中断...

    关于r - 为什么对列表进行分类会减慢 lengths() 函数的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41350665/

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