为什么 Julia 不能超集 python?
Why couldn't Julia superset python?
Julia 语言语法看起来与 python 非常相似,而 class 的概念(如果应该这样称呼的话)更像是您在 C 中使用的。有创作者决定在 OOP 方面有所不同的许多原因。仍然很难找到一些规范的方法来将 python 解释为 Julia,从而掌握所有 python 库吗(与首先创建 Julia 相比,这令人印象深刻)?
是的。 Python 的设计使得在编译时很难优化(即在 运行 代码之前)。说 Julia 因为 JIT 而快是完全错误的。相反,Julia 在设计时考虑了其类型系统和多重分派,这样编译器就可以知道编译 "the same code you would have written in C" 的所有必要细节。这就是让它变快的原因:类型系统。它做了一些权衡,允许它在 "type-stable" 函数中完全推断出每个变量的类型是什么,知道类型的内存布局应该是什么(包括参数类型,所以 Vector{Float64}
有一个内存布局,它由类型及其参数决定,它像 NumPy 数组一样内联 Float64
值,除了这是以您自己的 struct
类型获得相同效率的方式概括的),并且编译一个专门针对所见类型的代码版本。
这在很多方面都与 Python 不一致。例如,如果结构中的字段数可能发生变化,则无法确定内存布局,因此这些优化无法发生在 "compile-time" 处。 Julia 经过精心设计以确保它具有类型可推断性,并使用它来生成完全类型化的代码并删除所有 运行 时间检查(在类型稳定的函数中。当函数不是类型稳定的时,变量的类型变成动态的而不是静态的,并且它会减慢到 Python-like 速度)。从这个意义上说,Julia 实际上甚至还没有优化:它的所有性能都来自 "for free" 鉴于其类型系统的设计。 Python/MATLAB/R 必须在 运行 时非常努力地进行优化,因为它没有能力进行这些推导。事实上,就 运行 时间优化而言,这些语言现在 "better optimized",但还没有人真正在 Julia 中进行 运行 时间优化,因为在大多数性能敏感的情况下,您可以获得这一切都在编译时。
那么,Numba 呢? Numba 尝试采用 Julia 采取的路线,但使用 Python 代码,通过限制可以完成的操作,以便它可以获得类型稳定的代码并有效地编译它。然而,这意味着一些事情。首先,它不兼容所有 Python 代码或库。但更重要的是,由于 Python 不是围绕其类型系统构建的语言,因此在类型级别控制代码的工具大大减少了。所以 Numba 没有参数向量和通用代码,它们通过多重分派自动专门化,因为这些不是语言的特性。但这也意味着它无法充分利用该设计,这限制了它可以做的事情。它可以很好地处理 "use only floating point array" 的东西,但是如果你想让一个代码为 "any number type, even ones I don't know about" 生成高效的代码,你会发现它会受到限制。但是,根据设计,Julia 会自动执行此操作。
所以从本质上讲,Julia 和 Python 是两种截然不同的语言。很难看出,因为 Julia 的语法接近 Python 的语法,但它们的工作方式完全不同。
这是对我在几篇博文中描述的内容的简短总结。这些内容更详细,并向您展示了 Julia 如何实际生成高效代码,它如何为您提供通用的 "Python looking style" 但这样做完全具有可推论性,以及权衡是什么。
类型稳定性加上多重分派如何提供性能:
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/
Julia 语言语法看起来与 python 非常相似,而 class 的概念(如果应该这样称呼的话)更像是您在 C 中使用的。有创作者决定在 OOP 方面有所不同的许多原因。仍然很难找到一些规范的方法来将 python 解释为 Julia,从而掌握所有 python 库吗(与首先创建 Julia 相比,这令人印象深刻)?
是的。 Python 的设计使得在编译时很难优化(即在 运行 代码之前)。说 Julia 因为 JIT 而快是完全错误的。相反,Julia 在设计时考虑了其类型系统和多重分派,这样编译器就可以知道编译 "the same code you would have written in C" 的所有必要细节。这就是让它变快的原因:类型系统。它做了一些权衡,允许它在 "type-stable" 函数中完全推断出每个变量的类型是什么,知道类型的内存布局应该是什么(包括参数类型,所以 Vector{Float64}
有一个内存布局,它由类型及其参数决定,它像 NumPy 数组一样内联 Float64
值,除了这是以您自己的 struct
类型获得相同效率的方式概括的),并且编译一个专门针对所见类型的代码版本。
这在很多方面都与 Python 不一致。例如,如果结构中的字段数可能发生变化,则无法确定内存布局,因此这些优化无法发生在 "compile-time" 处。 Julia 经过精心设计以确保它具有类型可推断性,并使用它来生成完全类型化的代码并删除所有 运行 时间检查(在类型稳定的函数中。当函数不是类型稳定的时,变量的类型变成动态的而不是静态的,并且它会减慢到 Python-like 速度)。从这个意义上说,Julia 实际上甚至还没有优化:它的所有性能都来自 "for free" 鉴于其类型系统的设计。 Python/MATLAB/R 必须在 运行 时非常努力地进行优化,因为它没有能力进行这些推导。事实上,就 运行 时间优化而言,这些语言现在 "better optimized",但还没有人真正在 Julia 中进行 运行 时间优化,因为在大多数性能敏感的情况下,您可以获得这一切都在编译时。
那么,Numba 呢? Numba 尝试采用 Julia 采取的路线,但使用 Python 代码,通过限制可以完成的操作,以便它可以获得类型稳定的代码并有效地编译它。然而,这意味着一些事情。首先,它不兼容所有 Python 代码或库。但更重要的是,由于 Python 不是围绕其类型系统构建的语言,因此在类型级别控制代码的工具大大减少了。所以 Numba 没有参数向量和通用代码,它们通过多重分派自动专门化,因为这些不是语言的特性。但这也意味着它无法充分利用该设计,这限制了它可以做的事情。它可以很好地处理 "use only floating point array" 的东西,但是如果你想让一个代码为 "any number type, even ones I don't know about" 生成高效的代码,你会发现它会受到限制。但是,根据设计,Julia 会自动执行此操作。
所以从本质上讲,Julia 和 Python 是两种截然不同的语言。很难看出,因为 Julia 的语法接近 Python 的语法,但它们的工作方式完全不同。
这是对我在几篇博文中描述的内容的简短总结。这些内容更详细,并向您展示了 Julia 如何实际生成高效代码,它如何为您提供通用的 "Python looking style" 但这样做完全具有可推论性,以及权衡是什么。
类型稳定性加上多重分派如何提供性能:
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/