Julia v1.6 釋出!新功能介紹!
目錄
在 v1.6 版中,Julia 有大幅度的效能提昇,效能提昇的部份著重在於預編譯(precompilation)以及編譯的效能改進,而 v1.6 版將成為下一個長期支援(long-term support, LTS)的版本。
根據官方部落格,本次版本更新引進了眾多新的技術,包含 parallel precompilation、消除重複編譯、降低編譯器的 latency、加速二進位檔案的載入,以及改善 stacktrace 的格式等等重大的功能。那我們就來詳細看看有哪些更新吧!
重要功能
平行預編譯
使用者在 using/import 某些套件的時候,總是需要等待長久的預編譯時間,但在 v1.6 版引進了平行預編譯(parallel precompilation)技術來降低套件的載入時間。pkg> precompile 會啟動平行預編譯,並且以深度優先的方式,預編譯其套件下的所有相依套件。只有直接相依的套件(列於 Project.toml 中)會丟出錯誤訊息。平行預編譯會在 manifest 被更新之後自動啟動。平行預編譯也支援多套件同時編譯,它會使用多行程(multi-processed)的方式編譯。Julia 會預設地產生最大 CPU 核心數的預編譯任務並且執行平行預編譯。自動預編譯會記住在特定環境下所發生的錯誤,並且會在環境改變時再次嘗試。自動預編譯可以使用 ctrl-c 中斷,或是設定環境變數 JULIA_PKG_PRECOMPILE_AUTO=0 來關閉。
在 v1.5 版載入 DifferentialEquations.jl。
1 | (v1.5) pkg> add DifferentialEquations |
在 v1.6 版載入 DifferentialEquations.jl。
1 | (v1.6) pkg> add DifferentialEquations |
程式碼取自官方部落格。
避免重複編譯
延展性(extensibility)是 Julia 的重要功能之一,你可以對既有的 function 增加新的 method。有的時候,這些更動會讓 Julia 重新編譯程式碼。Julia 會讓「過期」的程式碼被標記,並且編譯新的程式碼。在 v1.6 版中,標記「過期」的程式碼的方式被改進,變得更為精準,如此可以避免重複編譯的問題。
使用者功能
語法
- Types written with
wheresyntax can now be used to define constructors, e.g.
(Foo{T} where T)(x) = ....
增加新的語法 import ... as ...
新增新語法 import A as B,也包含import A: x as y、import A.x as y 和 using A: x as y,可以對載入的模組跟辨識子重新命名。(#1255)
1 | julia> import DataFrames as DF |
注意,using 是不支援 as 的喔!
可以使用 ... 來指定解構的變數
1 | julia> a, b... = [1,2,3] |
陣列與集合
支援 init 關鍵字參數
sum、prod、maximum、minimum,以及 count 現在支援 init 關鍵字參數。(#36188, #35839, #37461)
集合容器支援更多運算子
集合容器現在也支援 ∉(collection)、∋(item)、∌(item) 這些方法。(#38475)
1 | julia> 1 ∉ [2,3,4] |
新的 NamedTuple 建構子
NamedTuple 有新的建構子,可以用 NamedTuple(iterator) 的方式來支援從 key-value 配對的集合容器中建構 named tuple。
1 | julia> d = Dict(:a => 1, :b => 2) |
點運算子可以被用於高階函式
1 | julia> map(.*, collect(1:5), collect(6:10)) |
Range 支援非整數型別
1 | julia> 1.0:0.1:10.0 |
要指定 x:y 以前都需要是整數型別 <: Integer 才行,現在 LinRange、StepRange 和 StepRangeLen 都支援非整數型別。(#32439)
訊息與呈現
@code_XXX 的格式更新
@code_llvm 及 @code_native 變成彩色的了!

稀疏矩陣的顯示格式更新
稀疏矩陣的顯示變得更直覺了!他自動隱藏非零值。(#33821)
1 | julia> sprand(4, 4, 0.5) |
UUID 用裝置亂數作為亂數產生器
變更 uuid1 和 uuid4 去使用 Random.RandomDevice() 作為預設的亂數產生器。(#35872)
開發者功能
開發
以後不再有 home project 的概念了!執行 julia --project=dir 等同於執行 julia、pkg> activate $dir 以及 julia --project 一系列命令。julia --project 等同於指定了 dir = Base.current_project()。(#36434)
編譯與型別推斷現在可以在模組中被啟用或是關閉,使用 Base.Experimental.@compiler_options 可以達到。(#37041)
二進位檔與函式庫
Pkg.Artifacts 模組目前可以被作為一個獨立的套件(Artifacts)使用,當然 Pkg.Artifacts 也可以。(#37320)
Pkg.BinaryPlatforms 被移動至 Base 成為 Base.BinaryPlatforms。(#37320)
如果要延遲下載 artifacts,LazyArtifacts 一定要被列在相依套件中。(#37844)
測試
@testset支援新的選項verbose來呈現測試結果。(#33755)
效能調校
字串支援 view
現在所有字串(AbstractString)都支援 view 囉! 也包含 @view 以及 @views,他們會回傳 SubString。(#35879)
1 | julia> s = "ABCDabcd" |
@time 增加編譯時間比例
在執行 @time 時,增加了顯示時間中有多少比例的編譯時間(compile time),@timev 則有更詳盡的資料(#37678)。
1 | julia> A = rand(5, 5) |
- 編譯器最佳化的常數傳遞(constant propagation)支援關鍵字參數(keyword arguments)。(#35976)
新功能
新增標準函式庫
在 v1.6 中,新增了兩個標準函式庫:TOML、Downloads。TOML 可以被用來解析 .toml 檔案。Downloads 提供了跨平台、多協定、行程內的下載功能,並使用 libcurl。它取代了原先的 Base.download,並提供 Downloads.download 介面。
陣列與其他集合
新功能 spdiagm([m, n,] v::AbstractVector) 支援由 v 作為對角線來生成稀疏矩陣的對角矩陣,其呼叫 spdiagm([m, n,] 0 => v),與稠密矩陣的 diagm 有對等的功能。(#37684)
新增 Iterators.map,也新增了 Iterators.map(f, iterators...) 的語法,簡化了 (f(args...) for args in zip(iterators...))。(#34352)
新功能 insorted 來確定一個集合容器中的元素是否是已經排序的。(#37490)
數值計算
現在 isapprox(x,y) 支援 norm 這個關鍵字參數,來計算兩者的範數(norm)是否接近,也支援非陣列的 x 跟 y 參數。(#35883)
新功能 LinearAlgebra.BLAS.get_num_threads() 可以取得 BLAS 的執行緒數量。(#36360)
平行運算
新功能 Base.Threads.foreach(f, channel::Channel) 支援多執行緒的 Channel 消耗。(#34543)
其他
新增 parse(::Type{UUID}, ::AbstractString) 方法。
新支援
陣列與其他集合
現在 append!(vector, collections...) 及 prepend!(vector, collections...) 方法都支援多個集合容器(collections)。(#36227)
1 | julia> a = rand(10); |
轉置(adjoint!(::*Triangular)、transpose!(::*Triangular))一個上(下)三角矩陣 *Triangular 會回傳相反的三角矩陣。套件中含有方法,像是 Adjoint{<:Any,<:LowerTriangular{<:Any,<:OwnMatrixType}} 需要被改為 UpperTriangular{<:Any,<:Adjoint{<:Any,<:OwnMatrixType}}。(#38168)
unique(f, itr; seen=Set{T}()) 現在容許你宣告容器的型別。(#36280)
I/O
redirect_* 函式現在接受 devnull 來拋棄所有輸出的資料,或是作為一個空的輸入來源。(#36146)
redirect_* 函式現在可以呼叫 IOContext 物件。(#36688)