gpt4 book ai didi

python - 为什么 Julia 不能超集 python?

转载 作者:太空狗 更新时间:2023-10-30 00:23:57 24 4
gpt4 key购买 nike

Julia 语言的语法看起来与 python 非常相似,而类的概念(如果有人应该这样调用它的话)更像是你在 C 中使用的东西。创建者决定与 python 不同的原因有很多尊重OOP。仍然很难(与首先创建 Julia 相比,这令人印象深刻)找到一些规范的方法将 python 解释为 Julia,从而掌握所有 python 库吗?

最佳答案

是的。 Python 的设计使得在编译时(即运行代码之前)很难进行优化。说 Julia 因为 JIT 而快是完全错误的。相反,Julia 在设计时考虑了其类型系统和多重分派(dispatch),这样编译器就可以知道所有必要的细节来编译“你会用 C 编写的相同代码”。这就是让它变快的原因:类型系统。它做了一些权衡,允许它在“类型稳定”函数中完全推断出每个变量的类型,知道类型的内存布局应该是什么(包括参数类型,所以 Vector {Float64} 有一个内存布局,它由类型及其参数决定,它像 NumPy 数组一样内联 Float64 值,除了这是以您自己的 struct 的方式概括的 类型获得相同的效率),并编译一个专门针对所见类型的代码版本。

这在很多方面都与 Python 不一致。例如,如果结构中的字段数可能发生变化,则无法确定内存布局,因此这些优化无法在“编译时”发生。 Julia 经过精心设计以确保它具有类型可推断性,并使用它来生成完全类型化的代码并删除所有运行时检查(在类型稳定的函数中。当函数类型不稳定时,类型变量变成动态的而不是静态的,并且它会减慢到类似 Python 的速度)。从这个意义上说,Julia 实际上甚至还没有优化:鉴于其类型系统的设计,它的所有性能都是“免费”的。 Python/MATLAB/R 必须非常努力地在运行时进行优化,因为它没有执行这些推导的能力。事实上,这些语言现在在运行时优化方面“优化得更好”,但还没有人真正在 Julia 中进行运行时优化,因为在大多数性能敏感的情况下,您可以在编译时获得所有这些。

那么,Numba 呢? Numba 尝试采用 Julia 所采用的路线,但使用 Python 代码限制可以完成的操作,以便它可以获得类型稳定的代码并高效地编译。然而,这意味着一些事情。首先,它不兼容所有 Python 代码或库。但更重要的是,由于 Python 不是围绕其类型系统构建的语言,因此在类型级别控制代码的工具大大减少了。所以 Numba 没有参数向量和通用代码,它们通过多重分派(dispatch)自动专门化,因为这些不是语言的特性。但这也意味着它无法充分利用该设计,这限制了它可以做的事情。它可以很好地处理“仅使用 float 组”的东西,但是如果您希望一个代码为“任何数字类型,甚至是我不知道的数字类型”生成高效代码,您会发现它会受到限制。但是,根据设计,Julia 会自动执行此操作。

因此,从本质上讲,Julia 和 Python 是截然不同的语言。很难看出,因为 Julia 的语法与 Python 的语法很接近,但它们的工作方式完全不同。

这是对我在几篇博文中描述的内容的简短总结。这些内容更详细,并向您展示了 Julia 实际上如何生成高效代码,它如何为您提供通用的“Python 外观风格”,但始终具有完全可推论性,以及权衡是什么。

类型稳定性加上多重分派(dispatch)如何提高性能:

http://ucidatascienceinitiative.github.io/IntroToJulia/Html/WhyJulia http://www.stochasticlifestyle.com/7-julia-gotchas-handle/

类型系统如何实现高性能通用设计

http://www.stochasticlifestyle.com/type-dispatch-design-post-object-oriented-programming-julia/

关于python - 为什么 Julia 不能超集 python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44890124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com