Julia 快到离谱?不,它并没有比 Python 快 340000,000,000 倍
作者 | Logan Kilpatrick
译者 | 红泥
操持 | 刘燕
Julia 运转速率很快,但从功能体现上看,也没快的那么离谱。
几周前,当我在 YouTube 上刷编程妙闻时,偶然中看到一个视频,它展现了 C++ 和 Python 从 0 加到 10 亿时的功能差别。不出所料,Python 在实行此利用历程中不好坏常快,耗时 1m52s,C++ 耗时 2.4s,但我很想看看 Julia 实行后果是什么样子。
接着,我开头写一些简便的 Julia 代码,来运转这个基准测试,以此看看 Julia 对否比 C++ 还快,对否能碾压 Python 很多(固然这不是一个专业性的比力实行,但仍旧可以作为一个幽默的参考目标)。
我使用的 Python 代码跟 YouTube 视频中的几乎一样,把它运转起来也比力简便:
import time
def count():
start = time.perf_counter()
n = 0
while n < 1000000000:
n += 1
print(f"Completed Execution in {time.perf_counter() - start} seconds")
count()
Completed Execution in 44.67635616599998 seconds
如您所见,我使用 Python 代码,整个盘算历程花了惊人的 44.67 秒,这个后果比视频中的运转时间快了很多,但这约莫是由于很多别的缘故招致的,好比我电脑 CPU 等硬件差别。
完成相反功效的 Julia 代码,与 Python 的代码比力相似,只需做一些小的窜改。
julia> function count()
n = 0
while n < 1000000000
n +=1
end
end
julia> using BenchmarkTools
julia> @benchmark count()
BenchmarkTools.Trial: 10000 samples with 1000 evaluations.
Range (min … max): 1.167 ns … 10.584 ns ┊ GC (min … max): 0.00% … 0.00%
Time (median): 1.250 ns ┊ GC (median): 0.00%
Time (mean ± σ): 1.261 ns ± 0.222 ns ┊ GC (mean ± σ): 0.00% ± 0.00%
我信赖,你一定也跟我一样,刚开头也为这个后果大吃了一惊。这段 Julia 代码只花了 1.25 纳秒。如此的后果好的令人难以相信,它比 Python 代码快了近 34,000,000,000 倍。
一个小小的区别是,这个函数现在还没有前往 n 的值。但是即使我们加上前往值,全体运转时间也基本维持在 2.0 纳秒支配。
别的,假如在 print 语句中打印出后果,这个时间破费接近~ 33.084 微秒,这分明影响很小。
1 evaluation.
Range (min … max): 25.333 μs … 79.291 μs ┊ GC (min … max): 0.00% … 0.00%
Time (median): 33.084 μs ┊ GC (median): 0.00%
Time (mean ± σ): 37.645 μs ± 9.828 μs ┊ GC (mean ± σ): 0.00% ± 0.00%
我晓得如此难以相信的后果应该不是真实的,之后我没有去 Julia slack 而是直接到 Julia 社区寻求协助,很快我便取得了一些好效反应,Mosè Giordano 发起使用 @code_llvm 来分析下 LLVM,看看在底层创建了什么(LLVM 是 Julia 的编译器)。
的确,之后 Julia 编译器在这个例子中发扬了紧张性的作用:
julia> @code_llvm count()
; @ REPL[7]:1 within `count`
define i64 @julia_count_868() #0 {
top:
; @ REPL[7]:6 within `count`
ret i64 1000000000
}
如您所见,编译器完全移除了循环,并选择立刻前往 10 亿的值。作为一个对编译器基本一无所知的人(我也希冀我能有更多的了解),这种利用着实让我大吃一惊。我写这篇文章的目标也是为了避免其他人在本人的代码中发觉相似的误导性基准。
在这种情况下,该函数没有充足的盘算繁复度,无法与 Python 版本举行富裕比力。
假如想了解 Julia 的真实速率功能,Mosè有一个不错的帖子,它对 Julia 的速率神话提出了挑唆,我剧烈发起你去看看:
Julia 怎样做基准测试
在 Julia 社区,基准测试是个抢手话题,因此有相当多的文档资源。我剧烈发起您通读 BenchmarkTools.j1 文档,有很多实践案例可以查察:
https://juliaci.github.io/BenchmarkTools.jl/stable/manual/
最简便的,你可以使用 @benchmark 宏对任何函数举行基准测试(提示——基准测试会“打印”代码,如下所示,约莫会招致很多东西打印在你的屏幕上):
julia> @benchmark print("Hello world")
Range (min … max): 25.125 μs … 87.625 μs ┊ GC (min … max): 0.00% … 0.00%
Time (median): 32.792 μs ┊ GC (median): 0.00%
Time (mean ± σ): 37.638 μs ± 10.026 μs ┊ GC (mean ± σ): 0.00% ± 0.00%
▁▃▆██▆▄▂ ▁
▂▅▇█████████▇▆▅▅▅▄▄▃▃▂▂▂▂▂▂▃▃▃▅▆▄▄▅▄▃▂▂▂▃▃▄▆█▇▆▅▃▃▃▄▃▂▂▂▁▁▁ ▃
25.1 μs Histogram: frequency by time 59.6 μs <
Memory estimate: 48 bytes, allocs estimate: 2.
你约莫会对 Valentin Churavy 写的关于 Julia 功能的 notebook 步骤感兴致,可以经过它更好的了解 Julia 功能。Valentin 是 Julia 的长时奉献者,在这个范畴有很大的威望性。
Valentin 是一个有伶俐的人,这里分享下他在 Julia slack 说过的一段话:
基准测试是困难的,你起首必要确保度量的是真实的东西?
使用 Julia 可以带来哪些方面的功能改良呢?
固然关于 Julia 的功能有很多夸大和错误引导的文章,但使用 Julia,比起 Python 和 Matlab 等言语,在大多情况下我们照旧能取得比力大的功能提升。
2022 年 4 月,SciML 团队在 Julia 博客上公布了一篇关于在 Julia 中使用小型网络举行封建机器学习的文章。他们将其功能与 PyTorch 的等效功能举行了比力,并在此基本上取得了 5 倍的速率提高。固然 PyTorch 通常是同类中最好的东西,但该文章重申,当您想将封建盘算团结到您的深度学习(DL)事情流程中时,Julia 在深度学习(DL)范畴的确具有较好的后果。你可以在这里阅读全文:
我们来看几个其他的例子:
图片来自 julialang.org
上图标识了几种基本利用及其在每种言语中的速率。该基准测试位于于:
https://julialang.org/benchmarks/,你可以去了解更多的细节。
Julia 提高速率功能的另一个场合是读取 CSV(大大多数据封建家应该都不乐意供认他们要经常做这个利用)。底下这篇文章写的十分好,它形貌了 Julia 和 CSV.jl 是怎样做到比 Python 和 R 快 10-20 倍的。
另一个案例泉源于 Pfizer(辉瑞) 公司的团队,他们使用 Julia 将他们的一些模仿速率提高了 175 倍:
为了制止反复造轮子,我想向各位保举最初一篇关于 Julia 速率功能的文章。在底下这篇文章中,作者先容了用 Julia 编写的一些基本算法,并将它们的功能与其他言语举行了比力:
假如您有 Julia 代码方面的疑问想要取得协助,可以到
https://discourse.julialang.org的“General Usage”主题、“Performance”子种别下发帖:
https://discourse.julialang.org/c/usage/perf。
英文原文地点:
https://juliazoid.com/no-julia-is-not-34-000-000-000-times-faster-than-python-f63e956313d7