performance - seq 和向量之间转换的性能成本是多少?

标签 performance clojure

许多核心 Clojure 函数都会返回惰性序列,即使将向量传递给它们也是如此。例如,如果我有一个数字向量,并且想要根据某些谓词过滤它们但返回另一个向量,我必须执行以下操作:

(into [] (filter my-pred my-vec))

或者:

(vec (filter my-pred my-vec))

虽然我不确定两者之间是否有任何有意义的区别。

此操作是否昂贵,或者您是否可以免费有效地获得它,就像在转换为 transient 或从 transient 转换时一样?

我知道 seq 是惰性的,因此在将其放入输出向量之前实际上不会计算任何内容,但是从 seq 和具体集合进行转换是否有开销?它可以用 big-O 来表征吗?或者 big-O 在这里没有意义吗?当从向量转换为序列时,另一种方式怎么样?

最佳答案

Clojure 网站上有关于 good use cases for transducers 的常见问题解答,这对于某些复杂的转换(不仅仅是过滤,或者当谓词相当复杂时)可能很方便。否则您可以利用filterv ,它位于核心库上,您可以假设它为您做了任何合理的优化。

关于performance - seq 和向量之间转换的性能成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63274685/

相关文章:

sql - 数据库中不同锁定方案的影响的详细信息?

clojure - 如何检查某个东西是否是 Clojure 中的 Atom?

clojure - 构建一个懒惰的,不纯的id生成器

clojure - 为什么这个简单的 main 方法在 leiningen 运行时永远不会返回?

performance - 如何理解Hive中的解释计划?

performance - 负载测试软件

mysql - 如何知道 MySQL 何时达到服务器的内存限制?

clojure - 我可以使用 Clojure 的派生来创建我的 defrecord 类类型的层次结构吗?

clojure - 在 Clojure 中比较两个大文件(即;在顶帽对齐中找到未映射的读取)

r - 计算 R 中矩阵中每个唯一列出现次数的最快方法