为什么你应该学习Julia

Julia是什么?

Julia是于2012年发布的一种函数式编程语言。它的创建者希望将Python的可读性和简单性与以C语言为代表的静态编译语言的速度相结合。

Julia适合谁来使用?

Julia在数据科学家和数学家中很受欢迎。它可以与像Mathematica一样的数学和数据软件来共享功能(例如以1为基址的数组索引和功能设计),其语法更接近于数学家用于编写公式的方式。Julia还提供对并行和云计算的出色支持,这使其成为大数据项目的理想选择。

我应该学习Julia吗?

Julia是一门相对较新的语言并且其目前仍在开发状态中,所以与你所期望的成熟语言相比,其仍会有很多的bug并且原生包较少。而像Python和Java这样的成熟语言也会有更大的社区,所以会可以更容易地找到相关教程、第三方包和问题的解决答案。但是就另一方面来说,Julia的速度、易用性以及对大数据应用程序的适用性(通过对并行和云计算的高级支持)会帮助它快速增长并继续吸引新用户。很多Julia开发人员在谷歌,美国宇航局和英特尔等公司工作,诸如RStudio这样的重大项目都已经宣布计划增加对Julia的支持。

编译特性

Julia是一种编译型语言,这是它比解释型语言执行速度更快的原因之一。然而与传统编译型语言相比,Julia并不是严格静态类型的。它使用JIT(即时)编译来推断代码中每个变量的类型,这就导致它虽然是一种像Python一样可以从命令行运行的动态类型语言,但可以达到与与C和Go等编译语言相当的速度。

并行性

Python为了充分利用系统上所有的CPU内核,是可以并行运行代码的。然而,这需要导入模块并可能会出现一些会使并行难以工作的问题。相比之下,Julia对并行性的支持是基于顶层,并且其声明并行运行函数的语法是比较直观的:

nheads = @parallel (+) for i = 1:100000000
  rand(Bool)
end

由于Python比Julia更久远,拥有更广泛的用户群和庞大、热情的社区,所以Python有一个庞大的库并包含很多维护良好的库文件和包。Julia作为一种较新的语言,拥有较小的用户群,可用的软件包数量要少得多。您可以在Julia中运行Python库(通过调用PyCall包),也可以在Julia代码中调用和运行C/Fortran的库,这使得Julia用户可以访问比其他方式更多的外部库,但Python与Julia相比仍然具有大量原生包和充满活力的社区的优势。

类型检查

Python是一种动态类型语言,也就是说您可以在不指定类型的情况下声明变量,Python解释器会根据提供的值来确定类型(例如,m = 5将被解释为整数)。Julia中的变量不仅可以用这种方式声明, 其还可以为声明为指定类型或一系列可能的类型的变量。指定函数的预期类型有助于编译器优化以获得更好的性能,还可以防止因意外或不正确的输入而导致的错误。

多重分配

多重分配是指声明相同功能函数的不同版本以更好地处理不同类型的输入。例如,您可以编写两个不同的reverse函数,一个接受数组作为参数,另一个则接受字符串。Julia解释器将在调用reverse时检查参数的类型,并将函数分配给与该类型匹配的版本。

数组索引

Julia和Python(以及大多数其他现代编程语言)之间的一个很小但又重要的区别就是Julia中的数组是以1为基础索引的,这意味着您访问数组的第一个元素是this_array[1]而不是this_array[0]。这一选择是为了让Julia对Mathematica和其他技术计算工具的用户更加直观,但对于习惯于以0为基础索引语言的用户来说,这可能是令人沮丧(并且可能是错误)的根源。

应该如何开始使用Julia?

安装Julia

在所有平台上,安装Julia的推荐方法是通过Julialang下载页面上的官方软件包来进行安装。Mac和Windows版本将自动在您的计算机上安装Julia; 在Linux上,您必须解压.tar文件并将其移动或符号链接到系统路径上的确定位置:

写下你的第一个程序

  1. 在文本编辑器中,创建example.jl并添加以下内容:
    circumference函数指定只应接受浮点值作为输入(特别指定 Float64类型)。另外,pi是一个内置变量,您可以通过2pi就将它乘以2,而不是Python或类似语言的pi*2形式。
  2. 有很多方法可以运行此示例程序。如果Julia二进制文件变量已经设置在PATH中,则可以从命令行调用它:
  3. 从命令行,启动Julia REPL解释器并采用include方式包含example.jljulia include("example.jl")
  4. 然后,您可以直接从example.jl直接调用函数。下例传入整数来调用circumference
    发生上文的错误是因为circumference只接受浮点值,并且没有可接受整数的函数版本。您可以通过设置允许任何数字作为参数来避免此错误(例如参数使用radius::Real来允许所有实数)。您还可以通过声明另一个带有整数的同名函数来实现多重分配:

更多信息

有关此主题的其他信息,您可能有参考以下资源的需求。虽然我们希望提供的是有效的信息,但请注意,我们无法保证外部托管材料的准确性或及时性。

本文的版权归 PantaZheng 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

LeetCode测试数据的爬虫

LeetCode的(包括付费)题目到处都有,可是测试数据怎么找呢?我设想了一种方法,来获得每道题的测试数据。 首先,对于权限不严格的在线评测系统,比如以前常做的...

5108
来自专栏大内老A

WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[上篇]

对于上一篇文章 (WCF基本异常处理模式:[上篇]、[中篇]、[下篇]),主要是站在最终开发者的角度对WCF关于异常处理编程模式进行了介绍,接下来,我们需要将我...

1979
来自专栏不二小段

Julia in Jupyter——在Notebook中配置使用Julia语言

我刚接触Jupyter Notebook的时候曾经在别处看到一个说法,大意是Jupyter是Julia、Python、R三种语言缩写的合并,当时对Python比...

3944
来自专栏枕边书

设计模式,Let's “Go”! (上)

前言 最近读了《Head First 设计模式》,每天早上看一章,学习一个设计模式,做些笔记,然后晚上抽空用刚学习的 Go 语言实现一下。半个月下来书读完了,留...

1915
来自专栏狮乐园

简单探索 js 中 something >> 0 的原理

关于这个问题是今天改公司项目小程序的一个bug时看到的,修复这个bug的解决方法是需要引入 String.prototype.padStart 的 polyfi...

983
来自专栏禁心尽力

多线程之策略模式

今天给各位分享一种Java23种设计模式中最常见的设计模式--策略模式。为什么将策略模式和多线程绑在一起呢,不知道各位有没有注意过我们在进行多线程编程的时候,创...

2037
来自专栏文渊之博

Python 代码风格

1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要。 请记住可读性标准的目标是提升可读性。这些规则存在的目...

2619
来自专栏葡萄城控件技术团队

C# 8.0的三个值得关注的新特性

image.png C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。同时,C# 每个版本的发布都与同...

2558
来自专栏安恒网络空间安全讲武堂

赛前福利②最新2018HITB国际赛writeup

FIRST 距离“西湖论剑杯”全国大学生网络空间安全技能大赛只有9天啦! 要拿大奖、赢offer,那必须得来点赛前练习定定心啊~这不,讲武堂就拿到了2018HI...

3244
来自专栏葡萄城控件技术团队

C# 8.0的三个值得关注的新特性

1313

扫码关注云+社区