S4方法调度慢吗?

2023-11-27

我的 S4 类有一个被调用多次的方法。我注意到执行时间比独立调用类似函数要慢得多。因此,我在类中添加了一个类型为“function”的槽,并使用该函数而不是该方法。下面的示例显示了执行此操作的两种方法,并且它们的运行速度都比相应的方法快得多。此外,该示例表明该方法的速度较低并不是因为方法必须从类中检索数据,因为即使函数也这样做,它们也会更快。

当然,这种做事方式并不理想。我想知道是否有一种方法可以加速方法调度。有什么建议么?

    setClass(Class = "SpeedTest", 
      representation = representation(
        x = "numeric",
        foo1 = "function",
        foo2 = "function"
      )
    )

    speedTest <- function(n) {
      new("SpeedTest",
        x = rnorm(n),
        foo1 = function(z) sqrt(abs(z)),
        foo2 = function() {}
      )
    }

    setGeneric(
      name = "method.foo",
      def = function(object) {standardGeneric("method.foo")}
    )
    setMethod(
      f = "method.foo", 
      signature = "SpeedTest",
      definition = function(object) {
        sqrt(abs(object@x))
      }
    )

    setGeneric(
      name = "create.foo2",
      def = function(object) {standardGeneric("create.foo2")}
    )
    setMethod(
      f = "create.foo2", 
      signature = "SpeedTest",
      definition = function(object) {
        z <- object@x
        object@foo2 <- function() sqrt(abs(z))

        object
      }
    )

    > st <- speedTest(1000)
    > st <- create.foo2(st)
    > 
    > iters <- 100000
    > 
    > system.time(for (i in seq(iters)) method.foo(st)) # slowest by far
       user  system elapsed 
       3.26    0.00    3.27 

    > # much faster 
    > system.time({foo1 <- st@foo1; x <- st@x; for (i in seq(iters)) foo1(x)}) 
       user  system elapsed 
      1.47    0.00    1.46 

    > # retrieving st@x instead of x does not affect speed
    > system.time({foo1 <- st@foo1; for (i in seq(iters)) foo1(st@x)}) 
       user  system elapsed 
       1.47    0.00    1.49 

    > # same speed as foo1 although no explicit argument
    > system.time({foo2 <- st@foo2; for (i in seq(iters)) foo2()}) 
       user  system elapsed 
       1.44    0.00    1.45 

     # Cannot increase speed by using a lambda to "eliminate" the argument of method.foo
     > system.time({foo <- function() method.foo(st); for (i in seq(iters)) foo()})  
        user  system elapsed 
        3.28    0.00    3.29

成本在于方法查找,它在每次迭代中从头开始。这可以通过计算一次方法分派来短路

METHOD <- selectMethod(method.foo, class(st))
for (i in seq(iters)) METHOD(st)

这(更好的方法查找)将是一个非常有趣且有价值的项目;在其他动态语言中可以学到宝贵的经验教训,例如维基百科上提到的内联缓存动态调度 page.

我想知道您进行许多方法调用的原因是否是因为数据表示和方法的矢量化不完整?

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

S4方法调度慢吗? 的相关文章

  • 连接路径的函数?

    是否有现有的函数来连接路径 我知道实施起来并不困难 但仍然 除了照顾尾随 or 我需要注意正确的操作系统路径格式检测 即我们是否编写C dir file or dir file 正如我所说 我相信我知道如何实施它 问题是 我应该这样做吗 现
  • 获取数据集 R 包中所有对象名称的列表?

    如何获取对象中对象的确切名称列表datasets https stat ethz ch R manual R devel library datasets html 00Index html包裹 我在这里找到了很多 data package
  • R:交换两个变量而不使用第三个变量

    我有两个变量 即 a lt 1 b lt 2 我想交换他们的价值观 是否有任何内置的 R 函数能够执行该操作 或者是否有其他优雅的方式 而不使用第三个 临时 变量 Note 如果可能的话适用于字符串或其他数据类型 有一个通用的解决方案或 技
  • 将 stat_smooth 添加到 ggplot2 中的仅 1 个方面

    我有一些数据 在某个因素的某个水平上 存在显着的相关性 在另一个层面上 则没有 并排绘制这些图很简单 使用 stat smooth 向它们添加一行 也很简单 但是 我不希望线条或其填充显示在两个面之一中 有没有一种简单的方法可以做到这一点
  • R 监督潜在狄利克雷分配包

    我在用着这个LDA包 https cran r project org web packages lda 对于 R 具体来说 我正在尝试做监督潜在狄利克雷分配 slda https www cs princeton edu blei pap
  • 为什么表达式“1”==1 的计算结果为 TRUE? [复制]

    这个问题在这里已经有答案了 1 是字符值 其他1是数字 甚至 当我尝试在下面执行时 它给了我 TRUE as character 0 as numeric 0 谁能帮助我理解 为什么 来自help 如果两个参数是不同类型的原子向量 则其中一
  • 如何修改反应链以便最后修改的对象控制其他链接的对象?

    新注释 1 最终解决的代码发布在最底部 反映了 ismirsehregal 于 2021 年 12 月 3 日的解决方案 以及一些标记为 ADDED 和 MODIFIED 的小调整 ADD 是为了解决我在矩阵 2 添加值后从矩阵 1 中删除
  • 包什么时候需要为它自己的对象使用 :::

    考虑这个 R 包有两个函数 一个是导出函数 另一个是内部函数 hello R export hello lt function internalFunctions hello internal 你好 内部 R hello internal
  • 如何在复杂的皂膜GAM中设置更平滑的边界条件?

    我正在对南太平洋岛屿泻湖中宽吻海豚的分布进行建模 我想使用肥皂膜平滑器来模拟海豚在二维表面 经度 x 纬度 上存在的概率 考虑到陆地边界 显然海豚不能在陆地上行走 我想知道如何将我的研究区域 陆地和近海水域 的边界固定为等于零的条件 因为我
  • 二部图匹配以匹配两个集合

    我是新手igraphR 中的包 我有两套A and B 每个都有N顶点 A1 A2 AN and B1 B2 BN 每个元素之间都有一个边缘A对每一个元素B 我有一个函数fWgt Ai Bj 返回之间的边的权重Ai and Bj 我一直在尝
  • 使用 alpha 通道叠加两个 ggplot2 stat_密度2d 图

    我想叠加两个ggplot2使用 alpha 通道进行绘图 结果图像显示两个数据集 这是我的测试数据 data read table text P1 1 0 4 nP2 0 0 2 nP3 2 1 8 nP4 2 2 6 nP5 0 5 2
  • 为什么我在 R 向量的类别中看到“整数”而不是“向量”

    为什么从数据框中切片的列的数据类型显示为 整数 而不是 向量 df lt data frame x 1 3 y c a b c x y 1 1 a 2 2 b 3 3 c c1 lt df 1 1 1 2 3 class c1 1 inte
  • mtext:使用布局时较小的标签描述

    使用 mtext 作为标签描述与使用 xlab 的作用不同 如何使 mtext 标签始终与使用 xlab 时的大小相同 无需始终定义 cex 参数 在下面的最小示例中 两个图的 cex cex lab 1 不过大小不同 layout mat
  • 可以使用部分名称访问列表成员吗?这是一个功能吗?

    考虑这个 R 代码 gt l list key 1 gt l k 1 1 gt l ke 1 1 gt l k NULL gt names l 1 key 这是否意味着您可以使用以下方式访问列表成员 及其部分名称 当我在一次令人沮丧的错误搜
  • 如何在 R 中压缩多个 CSV 文件?

    我正在尝试在 R 中压缩多个 CSV 文件 下面是供参考的代码 Create two dataframes using inbuilt datasets for reproducible code df1 lt head mtcars df
  • 如何将曲线拟合到直方图

    我已经探讨了有关该主题的类似问题 但在我的直方图上生成漂亮的曲线时遇到了一些麻烦 我知道有些人可能会认为这是重复的 但我目前还没有找到任何可以帮助解决我的问题的东西 尽管数据在此处不可见 但这里是我使用的一些变量 以便您可以在下面的代码中看
  • 在 R 中创建 xlsx 工作表 - 字体颜色不起作用

    我正在开发一个项目 需要从特定类型的数据框架自动生成数据电子表格 我读过关于如何执行此操作的有用解释here http www sthda com english wiki r xlsx package a quick start guid
  • r - ggplot2 - 突出显示选定的点和奇怪的行为

    我想突出显示选定的点并遇到一些奇怪的行为 首先是一些虚拟数据 a lt 1 50 b lt rnorm 50 mydata lt data frame a a b b ggplot mydata aes x a y b geom point
  • 在模块中使用shiny的renderUI

    这是我在 stackoverflow 上的第一个问题 我在闪亮 1 0 5 中遇到模块和 renderUI 的问题 当我在中使用 renderUI 时 Main Part ui lt bootstrapPage uiOutput Dynam
  • R 中的整数或双精度列表

    我有一个大约 1000 个整数的列表 我需要能够进行一些数学计算 但它们被困在列表或字符形式中 我怎样才能切换它们以便它们可用 样本数据 gt y 1 1 7 3 1 6 7 1 7 6 5 3 1 3 3 0 6 2 4 9 19 1 9

随机推荐

  • 清除 MKMapView 的图块缓存吗?

    我正在开发一款使用 MKMapView 作为游戏场的 iPhone 游戏 玩了几分钟后 应用程序不可避免地开始变得缓慢 并最终由于内存不足而崩溃 经过深入研究 罪魁祸首似乎是地图视图不断需要更多内存 游戏需要对地图进行大量缩放和平移 因此我
  • 如何在C/C++中设置ffmpeg qscale进行图像编码

    我有一个使用 ffmpeg 作为后端的 C 工作图像编码器 我正在将视频输入并将帧保存为 jpeg 但我在调整输出 jpeg 的质量时遇到困难 我尝试过的事情 环境AVCodecContext s global quality and co
  • 为什么函数原型位于不同的函数块内?

    我试图通过 K R 来理解 C 我无法理解书中发现的两个函数的代码 void qsort int v int left int right int i last void swap int v int i int j if left gt
  • NetBeans 使用哪种 Java 编译器?

    如果我告诉 NetBeans 6 9 在保存时进行编译 NetBeans 会警告我编译的类与使用 JDK 编译器编译的类不同 在同一对话框中 Java 平台设置为 JDK 1 6 NetBeans 使用哪个编译器 为什么 NetBeans
  • .NET FtpWebRequest 是否支持隐式 (FTPS) 和显式 (FTPES)?

    我被要求支持隐式和显式 FTPS 也称为 FTPES 我们目前使用的是 NETFtpWebRequest 是否FtpWebRequest支持两种类型的FTPES 有什么区别 Thanks 据我所知 当前 NET 2 0 和 3 5 版本的
  • 根据 Pandas python 中的两个条件选择数据帧的行

    我有一个 df 我想运行类似的命令 subsetdf df loc df Item Desc str contains X True or df Item Desc str contains Y True 选择 项目描述 列中包含 X 或
  • Emacs 中 LaTeX 的代码折叠

    是否有一个 Emacs 次要模式 或一段 elisp 代码 可以让您在 LaTeX 模式下有选择地隐藏 显示环境 例如 我想移动到一个很长的开头 begin figure 块 击键 然后将该图形环境的内容隐藏在视图中 类似地与 begin
  • Android 的仪器测试 - 方向改变后如何接收新的 Activity?

    我正在尝试测试新创建的活动 方向更改后 是否已正确重新初始化 下面的代码显示从 getActivity 返回的活动是在 setUp 中构造的活动 而不是新创建的活动 Test public class MyActivityTest exte
  • 如何在使用按键移动时在 pygame 中转动精灵

    So basically ive been hoping it would be possible to effectively turn your sprite while moving it around with WASD Any i
  • 当 UIViewController 被释放时,调度队列会发生什么?

    我试图更好地理解保留周期 特别是相对于调度队列 我正在使用 AVFoundation 并在 sessionQueue 上管理 AVCaptureSession private let sessionQueue DispatchQueue l
  • 正则表达式提取两个字符或标签之间的所有子字符串

    我需要提取由两个字符 或者可能是两个标签 包围的所有字符串 这就是我到目前为止所做的 NSRegularExpression regex NSRegularExpression regularExpressionWithPattern op
  • MySQL删除重复记录但保留最新记录

    我有独特的id and email字段 电子邮件会重复 我只想保留所有重复项的一个电子邮件地址 但包含最新的id 最后插入的记录 我怎样才能实现这个目标 想象一下你的桌子test包含以下数据 select id email from tes
  • 与 Xcode 分开安装 Git

    首先 我很抱歉这是一个非常简单的问题 但 Git 对我来说绝对是全新的 基本上 我已经涉足 iOS 开发一段时间了 现在有了一个项目想法 我想开始研究 并且我第一次计划将其纳入源代码管理 现在我知道 Xcode 4 有一些 Git 集成 但
  • mariadb IF 语句错误消息?

    我测试sql查询 IF 3 3 THEN SELECT TRUE ELSE SELECT FALSE END IF 我在 SQLyog 中执行查询 我收到下面的错误消息 You have an error in your SQL synta
  • 多对多关系的内联表单集的挂件

    遵循凯文 迪亚斯 Kevin Dias 的指示本文 我尝试为两个相关模型生成一种表单 这似乎适用于一对多关系 但是我在使用多对多关系时遇到了问题 以下是用户角色管理的一些示例代码 models py from django db impor
  • 如何授予 SQL Server 读取我的 SSL 密钥的权限?

    我最近创建了一个自签名证书并在 SQL Server 2014 中打开了加密 问题是现在 SQL Server 服务无法启动 本文from 2010 将问题识别为权限问题 SQL Server 服务没有读取 SSL 证书私钥的必要权限 问题
  • 如何计算 linq to sql 查询中列值的总和?

    我写这个查询 var query2 from p in behzad Compare closed numbers in CRM and Billing system detail counters where p fileid point
  • Eclipse 调试 - 行:不可用

    我似乎在谷歌上找不到任何东西告诉我为什么会这样以及解决方案是什么 我正在逐步执行第三方代码 我有源代码 并且非常希望看到当前行正在执行 查看 javac 编译标志 我看到 g none 标志 如果设置了此标志 这是否足以解释为什么我看不到行
  • 在 Angular2 中跨模块共享服务的最佳方式是什么

    我正在使用如下所述的应用程序结构 index ts app module ts app component ts hero directory hero module ts hero ts Data Object hero service
  • S4方法调度慢吗?

    我的 S4 类有一个被调用多次的方法 我注意到执行时间比独立调用类似函数要慢得多 因此 我在类中添加了一个类型为 function 的槽 并使用该函数而不是该方法 下面的示例显示了执行此操作的两种方法 并且它们的运行速度都比相应的方法快得多