Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 有一种快速的方法可以将Clojure向量用作矩阵?_Performance_Clojure_Profiling - Fatal编程技术网

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

Performance 有一种快速的方法可以将Clojure向量用作矩阵?,performance,clojure,profiling,Performance,Clojure,Profiling,我正在尝试使用Clojure处理图像,我希望使用Clojure数据结构表示图像。基本上,我的第一种方法是使用向量向量和mapv对每个像素值进行运算,并返回具有相同数据结构的新图像表示。然而,一些基本操作花费了太多的时间 使用jvisualprofiler,我得到了如下结果。有人能给我一个提示来提高性能吗?如果有必要的话,我可以提供更多的细节,但也许只要看看seq和next的成本,就有人可以很好地猜测 Clojure提供了一个介于完全持久性和非持久性之间的中间地带,就像使用标准java数组一样。这

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

使用jvisualprofiler,我得到了如下结果。有人能给我一个提示来提高性能吗?如果有必要的话,我可以提供更多的细节,但也许只要看看
seq
next
的成本,就有人可以很好地猜测

Clojure提供了一个介于完全持久性和非持久性之间的中间地带,就像使用标准java数组一样。这允许您使用快速原地变异操作(仅限于当前线程)构建映像,然后调用
persistent
将其在恒定时间内转换为适当的持久结构,以便在程序的其余部分进行操作


看起来,你在从序列中处理图像内容时也看到了很多开销,如果瞬态没有足够的差异,你可能想下一步考虑使用普通的java数组,并构造访问直接访问数组元素。p> 我真的认为应该使用原语数组来实现这一点。Clojure具有内置的数组支持,即使它没有突出显示,并且它适用于这样的情况,即您有大量的数字数据

任何其他方法、向量、甚至java集合都会导致所有数字被单独装箱,这是非常浪费的。原语数组(int、double、byte,任何合适的)没有这个问题,这就是它们存在的原因。人们对在clojure中使用数组感到害羞,但他们这样做是有原因的,就是这样。这将是一个很好的可移植clojure代码——int数组在jvm clojure和clojure脚本中都可以工作


尝试使用数组和基准测试。

您应该查看和相关库,了解与矩阵计算有关的任何内容。matrix是用于矩阵计算的通用Clojure API,支持多个后端实现

Clojure的持久数据结构在大多数情况下都很好,但实际上不适合快速处理大型矩阵。主要问题是:

  • 不变性:通常是一件好事,但对于出于性能原因需要在可变数组中累积结果的低级代码来说,不变性可能是一个杀手
  • 装箱:Clojure数据结构通常装箱结果(如java.lang.Double等),这与使用原语相比增加了大量开销
  • 序列:作为序列遍历大多数Clojure数据结构涉及创建临时堆对象来保存序列元素。通常不是问题,但当您处理大型矩阵时,它会成为问题
您可能希望查看的相关库包括:

  • :一个非常快速的矩阵库,作为完整的core.matrix实现。底层代码是纯Java的,但是有一个很好的Clojure包装器。我相信这是目前在Clojure中进行通用矩阵计算而不使用本机代码的最快方法。在幕后,它使用Java原语数组,但您不需要直接处理这个问题
  • :Clojure的另一个快速矩阵库,也是core.matrix实现。在引擎盖下使用JBLAS
  • :将Java BuffereImage表示为core.matrix实现,因此您可以对映像执行矩阵操作。现在有点实验性,但应该适用于基本用例
  • :用于程序图像处理的库。与其说是矩阵库本身,不如说是使用基于Clojure的DSL创建和操作数字图像非常有用
根据需要,最好的方法可能是使用图像矩阵将图像转换为矢量clj矩阵,并在那里进行处理。或者,Clisk也可以做你想做的事情(它有很多现成的过滤器/失真效果等)


免责声明:我是上述大多数库的首席开发人员。但是我自己都在用它们来做严肃的工作,所以我非常愿意证明它们的有用性,并帮助解决您发现的任何问题。

只是出于好奇,您尝试过新的库吗?这是一个非常新的方法,但他们正在尝试提出一个矩阵操作的通用方案,可能值得一看。更好的方法是使用Clojure库为您包装基本数组的处理,例如vectorz cljUnder the hood,
mapv
使用瞬变来生成新向量。所以,从这个意义上说,我几乎没有任何改进要做。Java数组似乎是个更好的主意。很好!我真的很喜欢这个主意,我会看看的!但是,至少现在,我也希望使用整数矩阵。