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
where
syntax 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)