我正在使用Clojure中的一个应用程序,它需要繁殖大型矩阵,并且与相同的Numpy版本相比,遇到了一些大的性能问题.Numpy似乎能够在一秒钟内通过其转置乘以1,000,000x23矩阵,而等效的clojure代码需要超过六分钟.(我可以从Numpy打印出结果矩阵,所以它肯定会评估所有内容).
我在这个Clojure代码中做了哪些非常错误的事情?我可以尝试模仿Numpy的一些技巧吗?
这是python:
import numpy as np
def test_my_mult(n):
A = np.random.rand(n*23).reshape(n,23)
At = A.T
t0 = time.time()
res = np.dot(A.T, A)
print time.time() - t0
print np.shape(res)
return res
# Example (returns a 23x23 matrix):
# >>> results = test_my_mult(1000000)
#
# 0.906938076019
# (23, 23)
Run Code Online (Sandbox Code Playgroud)
和clojure:
(defn feature-vec [n]
(map (partial cons 1)
(for [x (range n)]
(take 22 (repeatedly rand)))))
(defn dot-product [x y]
(reduce + (map * x y)))
(defn transpose
"returns the transposition of a …Run Code Online (Sandbox Code Playgroud) 编辑: Clojure基准测试在基准测试游戏中有所提升.
我已经在社区维基上提出了这个问题并邀请其他人更新.
有人知道Clojure表现的基准吗?
我已经做了一些我自己的(虽然没有什么太正式),与其他功能语言(尝试Haskell和OCaml)相比,它不太公平.但是,与Java或JVM上的其他语言(例如Scala)相比,它看起来如何呢?它与其他Lisps相比如何?
关于在那里添加Clojure 的计算机语言基准游戏论坛上有一些讨论,但还没有完成任何工作.
编辑:我将继续添加到此,因为我发现更多:
@igouy指出,clojure的基准脚本是由github上的jafingerhut 创建的.
来自Clojure讨论组的两个非常相关的主题:
另外,这些博文:
最后,有关stackoverflow的相关问题:
这些讨论中的大多数让我认为Clojure的性能与JVM上运行的其他语言相比非常有利,尽管毫无疑问,在比较语言时可能很难得出一个广泛的结论,因为它们的性能可能会有很大差异依赖于任务.
编辑:
Lau Jensen刚刚在他的博客上发表了一篇关于使用JVM语言进行基准测试的讨论:"正确地进行基准测试".