【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

Julia 快到离谱?不,它并没有比 Python 快 340000,000,000 倍

  • 2023-01-03
    北京
  • 本文字数:2796 字

    阅读完需:约 9 分钟

Julia 快到离谱?不,它并没有比Python快340000,000,000倍

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 endjulia> using BenchmarkToolsjulia> @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

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2023-01-03 18:549328
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 494.9 次阅读, 收获喜欢 1968 次。

关注

评论

发布
暂无评论
发现更多内容

手把手教你实战开发黑白棋实时对战游戏

华为云开发者联盟

云计算 软件开发 游戏开发 华为云

洞见科技承建国家工信安全中心「隐私计算平台」,筑基互联互通生态底座

洞见科技

隐私计算 数据要素

Web3生态龙头AQUANEE,即将登录Gate等平台

股市老人

一文读懂天翼云自研TeleDB 数据库五大关键特性

天翼云开发者社区

天翼云对象存储ZOS高可用的关键技术揭秘

天翼云开发者社区

极客星球 | 开发者服务合规检测护航企业数字生态建设

MobTech袤博科技

信息安全 开发者服务 安全合规检测 SDK检测 数据健康

Flutter 开发一个通用的购物车数量编辑组件

岛上码农

flutter 安卓开发 ios 开发 跨平台应用 6月月更

GameFi新的契机,AQUANEE市场近状一览

EOSdreamer111

Streaming Data Warehouse 存储:需求与架构

Apache Flink

大数据 flink 编程 流计算 实时计算

知识图谱看高考,高考加油!高考学子金榜题名

清林情报分析师

数据分析 数据可视化 高考 知识图谱

做多线程并发扩展,这两点你需要关注

华为云开发者联盟

spring 多线程 高并发 开发 华为云

Spark Shuffle 原理

布兰特

大数据 spark

建立java和jin函数之间的关系

北洋

6月月更

全国首批“持证上岗”的区块链应用操作员来了

CECBC

GameFi新的契机,AQUANEE市场近状一览

西柚子

引入区块链技术 是开展碳信息审计的有效举措

CECBC

千万级高并发下看天翼云如何为“健康码”突破技术瓶颈

天翼云开发者社区

NFT市场进入聚合时代,OKALEIDO成BNB Chain上的首个聚合平台

西柚子

太卷了!腾讯一面被问到内存满了,会发生什么?

Java全栈架构师

Java Linux 程序员 面试 操作系统

KusionStack 开源有感|历时两年,打破“隔行如隔山”困境

SOFAStack

开源 编程语言 语言 #Github 运维‘

寻找 Web3 的灵魂

CECBC

MySql函数

工程师日月

6月月更

NFT市场进入聚合时代,OKALEIDO成BNB Chain上的首个聚合平台

小哈区块

面向艺术家的Web3商业生态,由OKALEIDO的NFT聚合交易赋能

西柚子

详解大集群通信建模理论公式

华为云开发者联盟

数据库 华为云 查询

社区动态|SelectDB 联合传智教育推出免费 Apache Doris 中文视频教程

SelectDB

Doris 开源社区 Apaache Doris 开源治理

盘点:2022年10款比较火的项目管理软件

优秀

项目管理软件

Hoo首发上线CloudChat(CC) 推出空投5,000 USDT活动

区块链前沿News

Hoo

SoFlu 软件机器人:辅助企业落地 DevOps 的自动化工具

SoFlu软件机器人

天翼云践行“双碳”目标 “东数西算”绘画绿色发展新蓝图

天翼云开发者社区

架构实战营 - 第 6 期 模块八课后作业

乐邦

「架构实战营」

Julia 快到离谱?不,它并没有比Python快340000,000,000倍_AI&大模型_Logan Kilpatrick_InfoQ精选文章