- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
在C#中,我可以通过base关键字访问基类,在java中,我可以通过super关键字访问它。在delphi中如何做到这一点?假设我有以下代码: type TForm3 = class(TF
在这件事上我已经把头撞到墙上好几次了。所以我希望在正确的方向上得到一点帮助。 我有一张 table ,上面有订单,一张 table 上有火车,一张 table 上有航类,一张 table 上有巴士。每
在 Python 中,假设我有以下代码: class SuperClass(object): def __init__(self, x): self.x = x
我希望这个 subview 扩展到它的父 View 之外,但是父 View 的边框正在切入 subview 。有没有办法防止这种情况? class TheView : UIView { let
我有一个标准的高斯函数,看起来像这样: def gauss_fnc(x, amp, cen, sigma): return amp * np.exp(-(x - cen) ** 2 / (2
例如,我有下一个类,带有有界类型参数: public class ItemContainer { void addItems(List items); } 在另一个带有参数的类中使用: pub
如何将此设置转换为命令? 结果如下: // Manual Compression (see the image above) Compressed Size: 12,647,451 bytes //
请建议在应用继承时如何使用@Wither/@With。 我有一个抽象类Parent和具体的Child。 Child 应该是不可变的。将 @Wither 放在两者上会给我两个错误: 构造函数 Child
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在尝试向服务器(虚拟托管)发出 HTTP2 请求,该服务器根据主机 header 值 (SNI) 提供 SSL 证书。 # conn = hyper.HTTP20Connection('h
我有一个应用程序,必须将大约 1300 万行、大约 10 个平均长度的字符串插入到嵌入式 HSQLDB 中。我一直在调整一些东西(批量大小、单线程/多线程、缓存/非缓存表、MVCC 事务、log_si
我想定义一个函数f(x, t::Type)根据 isa(x, t) 是否执行不同的行为.假设我想调用b1(x)如果是,b2(x)除此以外。 我知道我可以像这样在运行时进行动态检查: function
我正在使用 Hyper-V WMI Provider在 Hyper-V 中导入虚拟机,特别是使用 ImportVirtualSystemEx Msvm_VirtualSystemManagementS
这几个星期以来一直困扰着我,我没有结束对它的研究,因为我目前重载并且它让我落后于第一年的 CS (opengl) 大学类(class),这首先让我研究了这个:如何只用一个 for 循环绘制立方体的所有
我正在我的计算机(操作系统:Windows 8)上开发一个 WP8 应用程序。我需要安装一个 VM 才能拥有 linux。同时我需要使用我的 Windows Phone 模拟器。 我下载了 VMWar
我是一名优秀的程序员,十分优秀!