performance - 有没有一种快速的方法可以将 Clojure 向量用作矩阵?

标签 performance clojure profiling

我正在尝试使用 Clojure 处理图像,我想使用 Clojure 数据结构来表示图像。基本上,我的第一种方法是使用向量的向量和 mapv 对每个像素值进行操作并返回具有相同数据结构的新图像表示。但是,一些基本操作会花费太多时间。

使用 Jvisual 探查器,我得到了如下所示的结果。有人可以给我提示以提高性能吗?如果有必要,我可以提供更多详细信息,但也许只要看看 seqnext 的成本,就有人可以很好地猜测。

Profiling results of an operation over the vector of vectors.

最佳答案

你应该查看 core.matrix 以及与矩阵计算有关的任何相关库。 core.matrix 是用于矩阵计算的通用 Clojure API,支持多种后端实现。

Clojure 的持久数据结构适用于大多数用途,但确实不适合大型矩阵的快速处理。主要问题是:

  • 不变性:通常是一件好事,但对于低级代码来说可能是一个 killer ,因为出于性能原因,您需要在可变数组中执行诸如累积结果之类的操作。
  • 装箱:Clojure 数据结构通常会装箱结果(如 java.lang.Double 等),与使用原语相比会增加很多开销
  • 序列:将大多数 Clojure 数据结构作为序列遍历涉及创建临时堆对象以保存序列元素。通常这不是问题,但当您处理大型矩阵时,就会出现问题。

您可能想要查看的相关库是:

  • vectorz-clj :一个非常快速的矩阵库,作为一个完整的 core.matrix 实现。底层代码是纯 Java,但有一个很好的 Clojure 包装器。我相信这是目前在 Clojure 中进行通用矩阵计算而无需借助 native 代码的最快方法。在底层,它使用 Java 基元数组,但您不需要直接处理它。
  • Clatrix :Clojure 的另一个快速矩阵库,也是一个 core.matrix 实现。在后台使用 JBLAS。
  • image-matrix :将 Java BufferedImage 表示为 core.matrix 实现,因此您可以对图像执行矩阵运算。现在有点实验性,但应该适用于基本用例
  • Clisk :用于程序图像处理的库。与其说是矩阵库本身,不如说它对于使用基于 Clojure 的 DSL 创建和处理数字图像非常有用。

根据您想要执行的操作,最好的方法可能是使用 image-matrix 将图像转换为 vectorz-clj 矩阵并在那里进行处理。或者,Clisk 可以开箱即用(它有很多现成的过滤器/失真效果等)

免责声明:我是上述大部分库的首席开发人员。但我自己将它们全部用于严肃的工作,因此非常愿意保证它们的有用性并帮助解决您发现的任何问题。

关于performance - 有没有一种快速的方法可以将 Clojure 向量用作矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16305137/

相关文章:

c++ - C++ std::unordered_map 与 Kotlin/Java HashMap 的性能对比

clojure - 使用 Clojure zipper 查找树中节点的位置

c - 为什么使用 gprof 会阻止程序的执行?

java - 用于性能指标存储的开源技术

r//如果一个data.table的其他列中的多个条件满足,则统计行数并求和列值//高效快速的data.table解决方案

c# - C#中的线程池太慢了,有没有办法加快速度? Thread.Sleep(0)和QueueUserWorkItem问题

从 SQL Server 中的另一个 SProc 调用一个 SProc 的性能影响

java - 从java调用clojure

emacs - 无法评估 nrepl + emacs 中的表单

java - VisualVM:CPU/内存分析器卡在 "Connecting to the target JVM..."