当前位置: 首页 > 知识库问答 >
问题:

Clojure性能,大向量上的大循环

阮喜
2023-03-14

我正在对大小为50,000个元素的两个向量执行基于元素的操作,并且有不满意的性能问题(几秒钟)。是否存在明显的性能问题,例如使用不同的数据结构?

(defn boolean-compare
  "Sum up 1s if matching 0 otherwise"
  [proposal-img data-img]
  (sum
  (map
    #(Math/abs (- (first %) (second %)))
    (partition 2 (interleave proposal-img data-img)))))

共有1个答案

袁泓
2023-03-14

试试看:

(apply + (map bit-xor proposal-img data-img)))

一些注意事项:

  • map将一个函数ping到多个集合,使用每个集合中的一个元素作为函数的参数-为此不需要interleavepartition
  • 如果您的数据是1和0,则异或将比绝对差分快
(def data-img (repeatedly 50000 #(rand-int 2)))
(def proposal-img (repeatedly 50000 #(rand-int 2)))
(def sum (partial apply +))

在预热JVM之后...

(time (boolean-compare proposal-img data-img))
;=> "Elapsed time: 528.731093 msecs"
;=> 24802

(time (apply + (map bit-xor proposal-img data-img)))
;=> "Elapsed time: 22.481255 msecs"
;=> 24802
 类似资料:
  • 本文向大家介绍clojure 向量,包括了clojure 向量的使用技巧和注意事项,需要的朋友参考一下 示例 向量用方括号表示: 除了使用文字语法之外,您还可以使用该vector函数来构造向量: 您可以使用vector?谓词测试某物是否为向量: conj 在向量的末尾添加元素: count 以固定时间返回项目数: 您可以使用来获得向量的最后一个元素peek: 您可以使用来获得没有最后一个元素的新向

  • 我正在Rust中创建一个无闩锁并发哈希映射。吞吐量曲线看起来就像我预期的那样,最多可达16个线程,此时性能将下降。 吞吐量(MOps/秒)与线程数 我使用了一个带有48个vCPU和200GB RAM的Google云实例。我尝试启用/禁用超线程,但没有明显的效果。 以下是我如何生成线程: 我没有主意了;我的Rust代码对于多线程是否正确?

  • 我一直在和来自Python的朱莉娅玩。我写了一些代码来解决这个难题。我在用蛮力的方法。代码在Python中运行需要一段时间(~30分钟),但在Julia中仍然需要大约3分钟。我确信这有点难看,因为我还在学习这门语言。我查看了优化器页面,在函数中输入了数据类型,并避免了全局变量。 与此相关的三个问题: > 肯定有更好的方法来做函数mymax。我找到了一些关于阿格马克斯的建议,但这给我带来了一个大麻烦

  • 问题内容: 我最近一直在尝试使用Redis和MongoDB,似乎经常会在MongoDB或Redis中存储 ID 数组。因为我要询问MySQL IN 运算符,所以我会坚持使用Redis 。 我想知道在IN运算符中列出大量(300-3000) id的 性能如何,看起来像这样: 想象一下简单的 产品* 和 类别 表,您通常可以将它们结合在一起以从某个 类别中 获得 产品 。在上面的示例中,您可以看到在R

  • 本文向大家介绍clojure 解构向量,包括了clojure 解构向量的使用技巧和注意事项,需要的朋友参考一下 示例 这是如何解构向量的方法: 然后,例如在一个let块内,您可以非常简洁地从向量中提取值,如下所示:            

  • 问题内容: 我们正在为IMAP帐户开发基于Java的邮件客户端,并使用最新的Java邮件api(1.5.6)。我们的客户拥有超过400个文件夹的邮件帐户。用户在文件夹上执行检查邮件,并在每个文件夹上进行迭代并获取新消息,例如, 或获取未读邮件的数量过多,这是因为文件夹数量巨大。(我们必须遍历400个文件夹) 为了提高性能,我们在线程中使用了并行工作连接,并且我们有一个SESSION实例,但是每个线