为什么 Seq.iter 和 Seq.map 慢这么多?

2023-11-22

考虑 F# 中的以下代码:

let n = 10000000
let arr = Array.init n (fun _ -> 0)

let rec buildList n acc i = if i = n then acc else buildList n (0::acc) (i + 1)
let lst = buildList n [] 0

let doNothing _ = ()
let incr x = x + 1

#time

arr |> Array.iter doNothing         // this takes 14ms
arr |> Seq.iter doNothing           // this takes 74ms

lst |> List.iter doNothing          // this takes 19ms
lst |> Seq.iter doNothing           // this takes 88ms

arr |> Array.map incr               // this takes 33ms
arr |> Seq.map incr |> Seq.toArray  // this takes 231ms!

lst |> List.map incr                // this takes 753ms
lst |> Seq.map incr |> Seq.toList   // this takes 2111ms!!!!

为什么是iter and map上的函数Seq模块比Array and List模块等效项?


一旦您致电Seq您丢失了类型信息 - 移动到列表中的下一个元素需要调用IEnumerator.MoveNext。比较对于Array你只需增加一个索引并为List你可以只取消引用一个指针。本质上,您会为列表中的每个元素进行额外的函数调用。

转换回List and Array由于类似的原因也会减慢代码速度

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

为什么 Seq.iter 和 Seq.map 慢这么多? 的相关文章

  • 访问特征矩阵的行向量时复制或引用

    我正在使用的代码Eigen http eigen tuxfamily org index php title Main Page矩阵库 我注意到在整个代码中 有如下访问器 RowVector3f V size t vertex index
  • 为什么在排序输入上插入到树中比随机输入更快?

    现在我一直听说从随机选择的数据构建二叉搜索树比有序数据更快 这仅仅是因为有序数据需要显式重新平衡以将树高度保持在最低限度 最近我实现了一个不可变的treap http en wikipedia org wiki Treap 一种特殊的二叉搜
  • F# 类型提供程序与 Lisp 宏

    我一直在阅读有关 F 3 0 类型提供程序的内容 例如here http msdn microsoft com en us library hh156509 aspx 并且它们似乎基于一种编译时代码生成 在这方面我想知道它们与 Lisp 宏
  • 如何缓存 ASP.NET 网站以获得更好的性能

    我是一名网页设计师 通常设计不需要更新的企业网站 所以我想将输出缓存一天 我怎样才能做到这一点 此外 任何有关在慢速服务器上提高 ASP NET 性能的建议都被接受 请注意 ASP NET 缓存有一个bug http connect mic
  • 双端队列与队列速度

    我正在研究 LeetCode 上的一个问题 Here https leetcode com problems moving average from data stream 当我完成这个问题后 我想出了 class MovingAverag
  • 用 C 更快地读取文件

    嗯 我想知道是否有一种比使用 fscanf 更快地读取文件的方法 例如假设我有这个文本 4 55 k 52 o 24 l 523 i 首先 我想读取第一个数字 它给出了接下来的行数 令这个数称为N N 之后 我想读取 N 行 其中有一个整数
  • PostgreSQL:在所有表字段的长度上创建索引

    我有一张桌子叫profile 我想按照填写最多的内容对它们进行排序 每列都是 JSONB 列或 TEXT 列 我不需要很大程度的确定性 所以通常我会按如下方式订购 SELECT FROM profile ORDER BY LENGTH CO
  • c++11 正则表达式比 python 慢

    嗨我想了解为什么以下代码使用正则表达式进行分割字符串分割 include
  • 是否存在比 SVN 更快的集中版本控制?

    我已经使用 SVN 很长时间了 现在我们正在尝试使用 Git 我在这里谈论的不是中心化 去中心化的争论 我唯一关心的是速度 后一个工具要快得多 但有时 我需要使用一种集中式方法 这种方法比分散式方法更简单 更简单 学习曲线非常快 这节省了大
  • 性能计数器的性能影响是什么

    当考虑使用性能计数器作为我公司的基于 NET 的站点时 我想知道使用它们的开销有多大 我是否想让我的网站不断更新其计数器 或者我最好只在测量时更新 设置性能计数器的开销通常不够高 无需担心 设置共享内存区域和一些 NET 对象 以及 CLR
  • setInterval() 如何影响性能?

    我们正在使用 Twitter Bootstrap 作为框架构建一个 Web 应用程序 但在显示 隐藏工具提示时遇到问题 除了尝试找到实际问题的解决方案之外 我还有一个关于我们同时使用的解决方法的问题 从性能角度来看 使用 setInterv
  • 为单个方法引用大 DLL

    我想在 C 中使用大型类库 dll 中的单个方法 是否有性能或其他方面的缺点 我应该使用反射工具 读取 方法代码并将其复制粘贴到我的项目中吗 更新 硬盘空间不是问题 我的应用程序是网络应用程序 是否有性能或其他方面的缺点 唯一真正重要的是可
  • Emacs 行编号性能

    我试过了linum and nlinum 两者对于超过 100k 行的文件的性能都很糟糕 for x in 1 100000 do echo x done gt 100k txt emacs q 100k txt M x load libr
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • 处理 C++ 中执行时间的大量分析

    我目前正在进行一个科学计算项目 涉及海量数据和复杂算法 因此需要进行大量代码分析 我目前依靠的是
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • F# 和模糊逻辑

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • Python——捕获异常的效率[重复]

    这个问题在这里已经有答案了 可能的重复 Python 常见问题解答 异常有多快 https stackoverflow com questions 8107695 python faq how fast are exceptions 我记得

随机推荐

  • NETWORK_PROVIDER 的 LocationListener 已启用,但从未调用 onLocationChanged

    我正在开发一个应用程序 可以在服务中全天 6 和 6 分钟内获取手机的位置 它工作正常 但有时该方法OnLocationChanged网络提供商侦听器的停止被调用 我不知道为什么 由于某种原因 它停止被调用 但当我手动启用或禁用提供程序时
  • 使用 stringstream 浮动的字符串

    我在网上找到了这段代码作为模板 用于进行字符串到 float int double 转换 它只是在这里 所以我有一些可以参考的问题 我想让用户输入一个数字作为字符串 将其转换为浮点数 测试它是否成功 如果输入是 Q 则退出 或者如果不是 Q
  • 创建扩展方法来生成打开和关闭标签,例如 Html.BeginForm()

    我想知道是否可以创建一个具有与 Html BeginForm 类似的功能和行为的扩展方法 因为它会生成一个完整的 Html 标记 并且我可以在其中指定其内容 tags 例如 我可以有这样的视图 此功能在我尝试使用示例中生成的功能的上下文中非
  • 使用动态键在 Typescript 中动态创建对象,无需将类型扩展为 { [key: string]: T }

    动态对象键 无需扩展至 key string V 我正在尝试创建一个 Typescript 函数来生成一个具有动态键的对象 其名称在函数签名中提供 而返回类型不会扩展为 key string V 所以我想打电话 createObject t
  • 检测文件是否在批处理文件中打开

    假设我有一个用于执行长时间构建的批处理文件 最后它会创建一个 EXE 如果我忘记在开始构建之前关闭应用程序 则链接阶段会在无法重新创建 EXE 时失败 我想检查 EXE 是否在以下位置打开start构建的 我尝试将 EXE 文件重命名为自身
  • Python 与 Ruby 相比的限制:lambda

    我浏览了 WikiVS 的一些页面 我引用了这些页面 因为 Python 中的 lambda 仅限于表达式 不能 包含语句 我想知道这个限制的一个很好的例子 或更多 最好与 Ruby 语言相比 感谢您的回答 评论和反馈 我不认为你真的在问
  • 如何让 github 页面提供像 RFC5785 的 /.well-known/ 这样的点文件?

    我有一个从我的文档项目的 Github master 分支填充的文档网站 我想要https mydomain well known security txt提供以下文件tree master well known security txt
  • 在Java中设置图标图像

    我一直在到处搜索如何在 Java 中设置图标图像 但它总是以不起作用或给我错误 在这里 在我的主要方法中放置代码 public static void main String args Game game new Game This rig
  • 不使用互操作/非托管代码监控打印后台打印

    背景 我正在使用 NET 4 0 用 C 编写一个应用程序 它按一定顺序打印一堆文档 这些文档具有不同的类型 并且实际上是使用 ShellExecute 和 print 动词打印的 为了确保顺序不会混乱 我想检查相关打印机的打印队列 我的主
  • 使用 javascript 设置 maxlength

    我正在尝试使用 JavaScript 动态设置输入字段的最大长度 显然这是 IE 的问题 我找到了部分解决方案 input title get 0 setAttribute max length 25 input title get 0 s
  • 查找 .NET 解决方案中未使用的资源

    如何在 resx 文件中查找可能已成为 孤立 且不再需要的未使用的图标 图像 字符串 最近ResXManager 1 0 0 41添加了一项功能来显示对字符串资源的引用数量
  • LINQ、Where() 与 FindAll()

    有人可以解释 LINQ 函数Where 和FindAll 有何不同吗 他们俩似乎都在做同样的事情 FindAll 是一个函数List
  • htons 中的混乱 - 小端/大端

    当我通过套接字从一个进程向另一个进程发送一个整型变量 然后在接收端打印该值时 在不使用ntohl htonl的情况下该值仍然相同 那么除了初始化套接字结构之外 我还需要在哪里使用这些函数 我理解小 大端 但是 当值保持不变时 为什么我们需要
  • 使用前向和后向正则表达式时出错

    我在使用以下正则表达式时遇到问题 它在 regexr 和 rubular 中运行良好 但在 node js 上运行时出现错误 我对使用正则表达式相当陌生 我不确定我做错了什么 如果我关掉它就会起作用 lt 所以我认为这就是问题所在 我正在尝
  • 照亮\广播\广播异常 无消息

    我在用着由 beyondcode 编写的 Laravel websocket 几天后 我已经连接到myDomain com laravel websockets第一步解决了 但现在 当我触发event laravel此时出现错误 publi
  • 如何前瞻性地使用Pandas的rolling_*函数

    假设我有一个时间序列 In 138 rng pd date range 1 10 2011 periods 10 freq D In 139 ts pd Series randn len rng index rng In 140 Out 1
  • 清除情节提要中使用的标签文本

    想知道是否有人知道如何完成以下 In a Storyboard我用虚拟文本设置标签 它们不是静态文本 例如 User1 用户名 我想知道是否有一个设置可以在视图加载该标签时清除该标签的值 我还有一些其他代码可以运行并收集相关信息 但是 可能
  • 检查 TypeScript 中的枚举中是否存在值

    我收到一个号码type 3并且必须检查它是否存在于该枚举中 export const MESSAGE TYPE INFO 1 SUCCESS 2 WARNING 3 ERROR 4 我发现的最好方法是将所有枚举值作为数组获取并在其上使用in
  • 函数式编程——for 和 while 循环

    我正在尝试写for and whilePython 中的循环 函数式编程风格 I think for构造很好 但是while不起作用 它无限运行 for loop lst 1 2 3 def fun e return e print map
  • 为什么 Seq.iter 和 Seq.map 慢这么多?

    考虑 F 中的以下代码 let n 10000000 let arr Array init n fun gt 0 let rec buildList n acc i if i n then acc else buildList n 0 ac