Julia

高性能科学计算语言 - Python 的易用性加 C 的速度,专为数值分析和 AI 设计

TL;DR

一句话:Julia 给你 Python 的易用性和 C 的速度——没有妥协。

核心优势

  • 像 C 一样快,像 Python 一样简单
  • 专为科学计算和 AI 设计
  • 多重分派是核心范式
  • 与 Python、C、R 互操作优秀

Philosophy

Julia 是为解决”双语言问题”而设计的:

  • 默认高效 - JIT 编译,无需为性能重写 C
  • 多重分派 - 函数根据所有参数类型特化,不只是第一个
  • 数学友好 - Unicode 运算符、矩阵语法、广播
  • 可组合 - 包之间无缝协作

Julia 就是如果 NumPy 是一门语言会是什么样子。

Quick Start

安装

# 使用 juliaup(推荐)
curl -fsSL https://install.julialang.org | sh

# macOS
brew install julia

# 或从 julialang.org 下载

验证(最新版:1.12)

julia --version  # julia version 1.12.0

第一个程序

创建 hello.jl

println("Hello, World!")
julia hello.jl

Julia REPL

julia
julia> 1 + 1
2
julia> sqrt(2)
1.4142135623730951

Language Essentials

变量与类型

# 变量(无需类型声明)
name = "Alice"
age = 25
price = 19.99
active = true

# 类型标注(可选)
x::Int = 10

# 数组
numbers = [1, 2, 3]
matrix = [1 2 3; 4 5 6]  # 2x3 矩阵

# 字典
user = Dict("name" => "Alice", "age" => 25)

控制流

# if-else
if age >= 18
    println("成年人")
elseif age >= 13
    println("青少年")
else
    println("儿童")
end

# 三元运算符
status = age >= 18 ? "成年人" : "未成年"

# for 循环
for i in 1:5
    println(i)
end

# while 循环
while count > 0
    count -= 1
end

函数

# 标准函数
function greet(name)
    return "Hello, $name!"
end

# 简写形式
greet(name) = "Hello, $name!"

# 匿名函数
add = (a, b) -> a + b

# 多重分派(核心特性!)
function process(x::Int)
    println("整数: $x")
end

function process(x::String)
    println("字符串: $x")
end

process(42)       # 整数: 42
process("hello")  # 字符串: hello

广播

# 用 . 对每个元素应用函数
x = [1, 2, 3]

x .+ 1        # [2, 3, 4]
x .^ 2        # [1, 4, 9]
sin.(x)       # [sin(1), sin(2), sin(3)]

# 适用于任何函数
f(a, b) = a + b
f.(x, 10)     # [11, 12, 13]

结构体

# 不可变结构体(默认)
struct Point
    x::Float64
    y::Float64
end

p = Point(1.0, 2.0)
# p.x = 3.0  # 错误!不可变

# 可变结构体
mutable struct MutablePoint
    x::Float64
    y::Float64
end

mp = MutablePoint(1.0, 2.0)
mp.x = 3.0  # OK

Gotchas

索引从 1 开始

arr = [10, 20, 30]
arr[1]    # 10(不是 0!)
arr[end]  # 30

首次运行慢(JIT 编译)

# 首次调用会编译函数
@time sum([1,2,3])  # 0.05s(包含编译)

# 第二次调用很快
@time sum([1,2,3])  # 0.000001s

数组是列优先的

A = [1 2 3; 4 5 6]  # 2x3 矩阵

# 按列迭代以获得更好性能
for j in 1:3, i in 1:2
    println(A[i, j])
end

循环中全局变量慢

# 慢
x = 0
for i in 1:1000000
    global x += i  # 访问全局变量
end

# 快 - 使用函数
function sum_loop()
    x = 0
    for i in 1:1000000
        x += i
    end
    x
end

When to Choose

适合

  • 科学计算
  • 机器学习(Flux.jl)
  • 数值模拟
  • 需要性能的数据科学

不适合

  • Web 开发(用 JavaScript、Python)
  • 移动应用
  • 小脚本(启动时间长)

对比

方面JuliaPythonMATLAB
速度中等
语法简洁简洁冗长
费用免费免费昂贵
ML 库成长中成熟有限

Next Steps

Ecosystem

包管理

# 在 REPL 中按 ] 进入 Pkg 模式
] add DataFrames
] add Plots
] status

# 或编程方式
using Pkg
Pkg.add("DataFrames")

主流包

  • 数据:DataFrames.jl、CSV.jl
  • 绑图:Plots.jl、Makie.jl
  • ML:Flux.jl、MLJ.jl
  • 科学:DifferentialEquations.jl、JuMP.jl