types - 类型稳定性如何让 Julia 如此之快?
问题描述
我听说类型稳定性是 Julia 如此快速的原因,同时仍然像 Python 等其他解释语言一样具有表现力。
解决方案
类型稳定性允许编译器在编译时直接根据输入类型确定函数的输出类型。因为 Julia 专门针对每种输入类型进行编译,这意味着如果所有函数都是类型稳定的,编译器可以推断出函数调用中每个值的类型。发生这种情况时,Julia 的 JIT 编译器将实质上创建该方法的静态类型版本并构建 LLVM IR 以编译该静态版本,其中该静态版本本质上与使用 clang (LLVM) 编译的 C 汇编代码相同。
这意味着,如果编译器可以推断出每个变量的基本类型,它就会并且它会发出强制这些类型保持的代码,就像它是完全注释的 C 代码一样。Julia 的动态方式是,当它不成立时,它将“装箱”变量,本质上是创建一个新类型,上面写着“我不知道类型是什么”,并添加用于强制类型检查的代码并在运行时调度计算以处理动态性。因此,如果所有类型信息都已知,Julia 的动态性将被编译掉,甚至不再存在于运行的代码中。
这也是为什么多重分派对语言如此重要的原因,因为多重分派意味着它f(x)
有不同的方法f(x::Float64)
(即使你没有指定具体版本,编译器也会推断并使用它,称为自动类型专业化) ,现在具体版本比一般版本更稳定。将多重分派作为一个特性公开实际上只是允许您拦截编译的这个阶段并允许更改类型->代码关系。
推荐阅读
- javascript - 重组对象数组的最佳方法
- pyinstaller - Pyinstaller:运行 .exe 时找不到模块
- java - 如何在 Xamarin 中向地图添加标记
- node.js - Passport-google-oauth 不能与 mongodb 地图集一起使用,但可以与本地 mongodb 一起正常工作
- django - Django ValueError:无法解析相关模型'api.User'
- css - mat-table 单元格上的多行 mat-tooltip 不起作用
- ruby-on-rails - 在 Rails 5.1+ 中,当我不知道我是否在 after_save 钩子中时,如何找出属性的初始值?
- java - 无法使用两种不同的机制验证签名
- spring - 为什么我在 Spring DAO 方法的 JSP 页面中出现 nullpointerexception?
- python-3.x - 如何在 GCP 中使用 pandas 和云函数读取 csv 文件?