何时使用
- 用 Julia 1.10+ 构建科学计算、数值方法、高性能或并行/GPU 应用时使用。
- 典型场景:设计多重派发与类型层级;攻克类型稳定(type stability)与性能瓶颈;用 BenchmarkTools 做基准、用 Profile 找热点;用 DifferentialEquations.jl / JuMP / Optimization.jl / Flux.jl / Turing.jl 做仿真、优化、ML 与贝叶斯推断;用 PkgTemplates.jl 起新包并配齐测试与 CI。
- 触发词:Julia、多重派发、类型稳定、@code_warntype、BenchmarkTools、Pkg、CUDA.jl、DifferentialEquations。
不该用的边界:
- 一次性脚本 / 只问基础语法(
for、if怎么写)—— 直接写即可,无需本技能。 - 项目无法或不打算引入 Julia(团队栈是 Python/R 且无迁移意图)。
- 纯数据可视化或纯统计建模且与性能/派发设计无关 —— 转通用数据技能。
步骤
按「需求 → 设计 → 实现 → 测试 → 调优 → 文档 → 规范化」推进,每步可独立验收:
- 分析需求:先问清目标、约束、输入输出;判断是否对类型稳定与性能敏感(决定后续是否需要
@code_warntype/ 基准)。 - 设计类型层级:用抽象类型 + 多重派发表达问题域;优先参数化类型写泛型;默认
struct(不可变)而非mutable struct,仅在必须原地修改时才可变。 - 类型注解实现:函数参数/返回值按需注解以提升可读性与编译期特化;避免抽象字段类型导致的类型不稳定(用参数化字段而非
Any)。 - 写测试:用
Test.jl组织@testset,实现前或同步编写;包级质量用Aqua.jl,静态分析用JET.jl。 - 基准与调优:
@btime/@benchmark(BenchmarkTools.jl)测时延与分配,@code_warntype查类型不稳定(红色Any/Union即问题点),Profile/@profile找热点;按需上Threads.@threads、@simd、CUDA.jl。 - 写文档:docstring + 示例;包文档用
Documenter.jl,文档内代码块可做 doctest。 - 规范化:
JuliaFormatter.jl按 BlueStyle 统一格式(提交前必跑)。
指令(给 Agent 的硬性流程)
- 绝不直接编辑
Project.toml—— 增删依赖一律走 Pkg REPL(]模式)或Pkg.jlAPI。 - 改完性能相关代码后,必须用
@code_warntype复核类型稳定,再用@btime量化前后差异,用数据而非直觉判断优化是否有效。 - 提交前必须
JuliaFormatter.format(".")(BlueStyle)。 - 避免类型盗用(type piracy):不要给「自己不拥有的类型」(外部包定义的类型 + 外部定义的函数)新增方法。
- 新建项目遵循
PkgTemplates.jl标准结构(含test/、CI、Project.toml)。 - 性能等价时优先函数式 / 不可变写法。
示例
REPL 包管理(不碰 Project.toml)
julia> ] # 进入 Pkg 模式
(MyPkg) pkg> add BenchmarkTools JET Aqua
(MyPkg) pkg> test
类型稳定诊断 + 基准
using BenchmarkTools
f(x) = x > 0 ? x : 0 # 三元保持同类型,稳定
@code_warntype f(1.0) # 全绿表示类型稳定;出现红色 Any/Union 需修
@btime f(2.0) # 测时延与内存分配
多重派发 + 参数化不可变类型
abstract type Shape end
struct Circle{T<:Real} <: Shape # 参数化,字段具体类型,类型稳定
r::T
end
struct Square{T<:Real} <: Shape
side::T
end
area(s::Circle) = π * s.r^2 # 按类型派发,零成本抽象
area(s::Square) = s.side^2
起新包 + 格式化
using PkgTemplates
Template(; user="me", plugins=[Git(), GitHubActions(), Codecov()])("MyPkg")
using JuliaFormatter; format(".") # BlueStyle
注意事项
- 类型稳定是性能第一原则:函数返回类型应由输入类型唯一确定;字段勿用抽象类型(
Vector{Any}≪Vector{Float64})。改前改后都过@code_warntype。 - 不可变优先:
struct默认不可变,利于栈分配与编译器优化;mutable struct仅在确需原地改写时使用。 - 绝不手改 Project.toml:手改易破坏 Manifest 一致性与可复现性,全程走 Pkg。
- 拒绝类型盗用:破坏组合性、引入隐性冲突;需扩展外部行为时用自有包装类型或 trait(Holy Traits)。
- 基准用
@btime而非@time(后者含编译时间、噪声大);多线程/GPU 改造前先确认热点确实可并行且收益>开销。 - 启动慢/部署可用
PackageCompiler.jl生成系统镜像;交互开发用Revise.jl热加载。
互见
- related:
cpp-modern-pro—— 同为高性能系统/数值语言,零成本抽象与内存布局思路相通。 - related:
python-performance-optimization—— 跨语言性能优化方法论可对照(profiling、向量化、并行)。 - related:
performance-profiler—— 通用剖析方法学,补充 Profile.jl 之外的定位思路。 - combines_with:
scientific-exploratory-data-analysis—— Julia 算出结果后做探索性数据分析与可视化。 - combines_with:
statsmodels-statistical-modeling—— 统计建模方法对照与结果交叉验证。
本条采编自 sickn33/antigravity-awesome-skills(MIT)。