我改编了一个简单的程序来计算和绘制 Julia 的运动涡流来测试语言,我也用 Python 编写了它,没有特别的原因。
(免责声明:1.我读过的关于stackoverflow的每一次性能比较都因不全面/正确/写得好/相关等而受到抨击-我不是假装这是一个真正的比较,我只是想知道如何进行Julia 更快。2. 我知道 python 可以被优化,在 Cython 等中实现,这不是这个讨论的一部分,它只是在这里作为 Julia 和 Python 中等效函数的参考。)
代码和性能结果可以在 gist中看到。
Julia 的性能明显慢于 Fortran。执行计算本身所花费的时间是(50000 个时间步长):
Fortran: 0.051s
Julia: 2.256s
Python: 30.846s
Julia 比 Fortran 慢得多(约 44 倍),差距缩小,但在 10 倍以上的时间步长 ( 0.50s vs 15.24s
) 时仍然很重要。
这些结果与 Julia 主页上显示的结果有很大不同。我究竟做错了什么?我可以将 Julia 修复得更快吗?
我已经浏览了Julia 性能提示页面和 Julia 主页上比较背后的代码,但我没有什么需要解决的。
同样有趣的是,Julia 加载 PyPlot ( 5secs
ish!!) 的速度非常慢,而且读取文本文件的速度也比 Python 慢得多。我能做些什么来改善这些事情吗?
请注意,上述时间并未显示 Julia 和 Python 的加载时间,它只是计算 AFAIK 所需的原始时间 - 请参阅代码。对于fortran,这就是全部。在每种情况下,绘图已大致关闭,以便进行速度比较。
计算机:Intel i7-3770,16GB 内存,SSD HD,操作系统:Ubuntu 13.10 64bit.,Fortran:gfortran,GNU Fortran (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1,Julia:版本 0.3.0-prerelease+396 (2013-12-12 00:18 UTC),提交 c5364db*(0 天老主),x86_64-linux-gnu,Python:2.7.5+
更新:
根据 ivarne 的建议,我重写了 Julia 脚本(在上面的要点中进行了更新):将 grunt 工作封装在函数中,声明所有内容的类型并将矩阵的不同元素拆分为适用的不同数组。(我在很多地方都包含了 Float64,因为我尝试使用 Float32 看看是否有帮助,但大多数时候都没有)。
结果如下:
50,000
时间步骤:
Fortran: 0.051s (entire programme)
Julia: raw calc.: 0.201s, calc. and return (?): 0.758s, total exec.: 6.947s
500,000
时间步骤:
Fortran: 0.495s (entire programme)
Julia: raw calc.: 1.547s, calc. and return (?): 2.094s, total exec.: 8.521s
综上所述:
你可以加快 Julia 的速度。
根据您如何衡量它的性能,您可以显着影响 Julia 的明显速度。