
如果您喜歡這篇文章,可以在我自己的部落格上閱讀此文章。
如果我被迫下注,在接下來的五年中,哪種程式設計語言将徹底改變科學軟體,那麼我會把錢花在Julia身上 。
後超C ++和Rust的系統程式設計革命将帶給系統工程,Julia将帶給科學計算。
朱莉娅是什麼,為什麼你要關心它?
盡管看起來與Python非常相似,但從最終使用者的角度來看,Julia還是有一些技巧。
一旦Julia代碼開始執行,它就是該程式的任何編寫良好的C,C ++或Fortran實作的比對項。
Julia使并行操作變得容易,并允許您編寫漂亮而簡潔的代碼,并且運作速度很快。 您可以在其官方網站上了解更多有關Julia的快速便捷內建和部署的資訊 。
Julia仍然是一種動态類型化的語言,這意味着可以鍵入值,但是沒有變量。 但是,它為建立值時的值類型提供了一種非常簡單的文法。 與Python不同,它的類型系統非常先進,這意味着您可以執行以下操作:
arr = Array{Float16,1}()
push!(arr, 12.9) # Works
push!(arr, "my string") # Give a type error
val = UInt8(11)
push!(arr, val) # `val` is cast to Float16 then appended
它還為諸如多元數組和使用SIMD優化的數組操作之類的内容提供本機支援。 此外,其數組是實際數組,而不是清單,而是連續配置設定的大塊記憶體,用于快速疊代和查找。
所有這些,意味着Julia可以實作驚人的矢量計算速度,而無需第三方容器或線性代數庫。
生成Julia集
既然它是如此低落的果實,我不妨通過生成和繪制一些Julia集來向您展示Julia 。
對于本部落格的其餘部分,我将嘗試向您展示一些Julia代碼,以展示其某些功能。 希望我會讓您相信它的效率。
要進行後續操作,您需要安裝Julia并在您選擇的文本編輯器中打開
.jl
檔案。 您可以使用
julia my_file.jl
運作代碼。
我喜歡Julia的一件事是,它消除了編寫快速過程代碼的大部分麻煩。 例如,這些函數會生成我們的Julia集矩陣。
function julia(x, y, width, height, c)
# Scale size the fractal within our frame
z = ((y/width)*2.7 - 1.3) + ((x/height)*4.5 - 2.5)im
for i = 1:255
z = z^2 + c
if abs(z) >= 4
return i
end
end
return -255
end
function julia_set(height, width, c)
[julia(x, y, width, height, c) for x = 1:height, y = 1:width]
end
我們可以使用給定的圖像大小和c參數調用
julia_set
,然後繪制所得矩陣的熱圖以檢視分形。
繪制熱圖
關于Julia的另一個好處是,它由社群維護。 可以在Julia代碼中混合使用C和Python庫的簡便且實際上不存在的開銷,使我們能夠使用許多成熟的庫,這些庫中不存在或不需要原生的Julia替代方案。
繪圖功能非常強大,但它遠未達到理想的記錄庫。 它提供了一個Juila接口,在該接口下,不同的後端(例如pyplot或plotyjs)将生成我們的圖像。 我将使用GR後端。
# Install the packages we need
Pkg.add("Plots")
Pkg.add("GR")
# Import the Plots library in the current runtime
using Plots
# Initialize the gr backend
gr()
好了,現在剩下的唯一事情就是選擇我們的
c
項,生成茱莉亞集合并繪制它。
# Set the size of our images
height = 800
width = 800
c = 1.2e^(1.1π*im)
# Generate the set
data = julia_set(height, width, c)
# Generate the heatmap and save it as a PNG
file_name = "/tmp/julia_$(height)_$(width)_$(c.re)_$(c.im)"
png(heatmap(data, size=(width,height), color=:ice), file_name)
這足以使我們産生相當大的分形,但是,我認為我們應該走得更遠。
動畫分形
我們可以使用Plots程式包做的另一件事是建立動畫,隻需通過ffmpeg将多個png背靠背放置即可。
這将使用
@animate
宏從我們的for循環中建立動畫來完成。 然後,
gif
函數将其儲存到檔案中并提供所需的幀速率。
現在,根據您選擇的c值,幀速率,配色方案和分辨率,您可以在此處獲得截然不同的動畫。 我建立了一個我很滿意的遊戲。
使其平行
生成圖像并計算集合可能需要很長時間。 但是,Julia提供了可以輕松并行化循環而沒有副作用的工具。 對于使用
@parallel
宏生成集合的循環,可以這樣做。
這裡要注意的一件事是,您需要使用-p參數運作Julia以從中受益。 例如
julia -p 10
,使用9個附加程序。
完成此操作後,需要使用
@everywhere
宏聲明函數,以便可以從所有程序通路它們。
@everywhere julia = julia
@everywhere julia_set = julia_set
# Re-write our code to generate the sets in parallel
nr_frames = 40
sets = @sync @parallel append! for n=0:nr_frames
c = e ^ (2*π*n/nr_frames*im)
set = julia_set(height, width, c)
[set]
end
anim = @animate for set in sets
heatmap(set, size=(width,height), color=:speed, leg=false)
end
file_name = "/tmp/julia_$(height)_$(width)_$(nr_frames).gif"
gif(anim, file_name, fps=4)
并行化動畫看似微不足道,但是由于
@animate
工作方式,它實際上要複雜一些。 我會将其作為練習留給讀者。
我鼓勵任何有興趣嘗試将這種語言用于其某些科學計算需求的人。
在很短的時間内,我開始偏愛Julia而不是Python,并且我确信我的一些讀者可能會感到相同
注意:如果您喜歡這篇文章,那麼我會有一篇關于學習Julia的後續文章(該文章涉及*炒作*機器學習): 對抗性生成的Julia集
From: https://hackernoon.com/julia-and-julia-sets-e5a6fa3de7a7