当前位置: 首页 > 科技观察

为什么我不再推荐你使用Julia?

时间:2023-03-18 15:42:03 科技观察

Julia从诞生到现在已经走过了十几年。Julia作为一种用于科学计算的高性能动态高级编程语言,在很多情况下具有媲美编译语言的性能,并且足够灵活。曾有开发者对Julia大加赞赏,认为Julia从速度、通用性、多重分派等多个维度上什至优于Python。当然,也有人发现Julia还是有一些不足之处。开发者YuriVishnevsky写了一篇博客来抱怨Julia,并表示在使用Julia多年后他已经正式禁用了它。这是博文:多年来我一直在使用Julia语言来转换、清理、分析和可视化数据,进行统计和执行模拟。我还发布了一些开源包,如最近邻搜索等。但是我前段时间停止使用Julia,我不再推荐它了,现在我将解释原因。根据我的经验,Julia和它的包在我用过的所有编程系统中错误率最高,我给你举个例子:抽样一个概率密度会是错误的;对数组进行采样会产生有偏差的结果;product函数可能会为8位、16位和32位整数产生不正确的结果;将直方图拟合到Float64数组会出错;原始函数sum!、prod!、any!和all!可能返回不正确的结果。其他一些开发者也提出了类似的问题:OrderedDictcancorruptkeys;dayofquarter()函数在闰年的情况下有错误;使用带有误差条的数字类型时,模拟结果不正确;stdout=IOStream管道写错了;一些copyto!方法会产生错误的结果,因为它们不检查别名;if-else控制流中存在错误。我经常遇到严重到足以让我质疑Julia中复杂计算的正确性的错误,尤其是在尝试新的包或函数组合时。例如,我发现Distance包中的欧氏距离不适用于Unitful向量;我还发现Julia运行外部命令的函数不适用于子字符串,Julia对缺失值的支持在某些情况下会破坏矩阵乘法,标准库的@分布式宏不适用于OffsetArrays...尤其是OffsetArrays事实证明这是正确性错误的重要来源。这个包提供了一个数组类型,它利用Julia灵活的自定义索引功能来创建数组,而不必以0或1开头。这可能会导致内存访问越界,如果幸运或错误的结果会导致段错误如果你不走运。我曾经在Julia核心代码中发现一个错误,它可能导致越界内存访问,即使用户和库作者都编写了正确的代码。我向JuliaStats组织提交了一些与索引相关的问题,该组织管理统计包,例如Distributions和StatsBase。我列出的问题包括:大多数采样方法在存在偏移轴的情况下是不安全和不正确的;拟合DiscreteUniform分布会返回不正确的答案;counteq、countne、sql2dist、L2dist、L1dist、L1infdist、gkldiv、meanad、maxad、msd、rmsd和psnr可能会返回带有偏移索引的错误结果;不正确地使用@inbounds可能导致不正确的统计计算;Colwise和pairwise会返回不正确的距离;偏移数组的权重向量越界访问内存。这些问题背后的根本原因不仅在于索引,还在于当在Julia中与@inbounds一起使用时,它允许Julia从数组访问中删除边界检查。函数sum(A::AbstractArray)r=zero(eltype(A))foriin1:length(A)@inboundsr+=A[i]#←