全文共3967字,預計學習時長12分鐘
全文共3967字,預計學習時長12分鐘
圖源:Unsplash
Julia是什么?
“操作似Python,運行如C語言”。
沒錯,這就是Julia素有的口號。
Julia作為一種現(xiàn)代編程語言,主攻科學計算,它是一種靈活的動態(tài)型語言,其性能可與傳統(tǒng)的靜態(tài)型語言相媲美。目前其追隨者和使用其的開發(fā)人員日益增多。
Julia試圖提供一種單一環(huán)境,此環(huán)境的生產(chǎn)能力足以進行原型設計,并能有效地應用于工業(yè)級應用程序。它是一種多范式語言,其中包含函數(shù)式和面向?qū)ο笫骄幊探M件,盡管大多數(shù)的用戶都喜歡其函數(shù)式編程的功能。
該編程語言的起源可追溯至2009年。首席開發(fā)人員Alan Edelman、Jeff Bezanson、Stefan Karpinski和Viral Shah著手創(chuàng)建該語言,以用于更快更好的數(shù)值計算。2012年2月,開發(fā)人員發(fā)布了該語言的一個商業(yè)版本。
為什么Julia對數(shù)據(jù)科學而言如此優(yōu)越?
Julia是數(shù)據(jù)科學和機器學習工作的最佳選擇,兩者原因大致相同,即它在數(shù)值快速計算方面最為適用。優(yōu)點如下:
· 平滑的學習曲線和大量的基礎功能。特別是,如果你已經(jīng)很熟悉如Python、R語言等更為熱門的數(shù)據(jù)科學語言后,學習Julia就好似在公園中散步一樣容易?!?性能:Julia最初是一種編譯語言,而Python和R語言是解釋語言。這就意味著Julia代碼以可直接處理代碼的形式在處理器上運行。· GPU支持:這與性能直接相關。GPU支持由某些軟件包,如TensorFlow.jl和MXNet.jl公開控制。· 分布式和并行式計算支持:Julia使用多種拓撲公開執(zhí)行并行式與分布式計算。它還支持協(xié)同程序,比如在GO編程語言中,協(xié)同程序是在多核架構(gòu)中并行工作的輔助函數(shù)。Julia廣泛支持線程和同步旨在最優(yōu)化性能、降低競爭風險?!?豐富的數(shù)據(jù)科學與可視化庫:Julia社區(qū)認為其是數(shù)據(jù)科學家和統(tǒng)計學家的首選語言。因此,主攻數(shù)據(jù)科學與分析的高性能庫一直處于開發(fā)狀態(tài)?!?團隊合作(與其它語言/框架共同使用):在數(shù)據(jù)科學和機器學習領域,Julia和其它成熟語言及框架的兼容性相當好。使用PyCall或RCall可以在Julia腳本中使用本地Python或R語言代碼。Plots包可以與包括Matplotlib和Plotly的各種端協(xié)同工作。Scikit-learn或TensorFlow等熱門機器學習庫已經(jīng)具有類似Julia的語言或包裝器?!?用戶友好的界面:不論是在本地還是云上,Julia 的用戶界面都非常友好,在所有的流程中,用戶與 Julia 的交流都非常順暢。Julia 還對所有的功能和數(shù)據(jù)類型提供了方便易用的幫助文件。· 與其他語言無縫對接:這些語言包括(但不限于)R、Python 和 C。這使你不需要進行完整的遷移,就可以使用現(xiàn)有的代碼庫。
綜上,Julia是數(shù)據(jù)科學和機器學習工作的最佳選擇,兩者原因大致相同,即它在數(shù)值快速計算方面最為適用。
具體案例與比較,Julia優(yōu)勢一目了然
使用Python腳本進行基準測試 有關“Julia比Python速度快嗎?”這一問題存在諸多爭議。 與生活中其它事情類似,答案是:視情況而定。
圖源:Unsplash
官方Julia語言門戶網(wǎng)站上有些相關數(shù)據(jù),盡管基準測試是針對Python以外的各種語言進行的。
事實上,這個問題總是認為人們所談論的是Julia與某種優(yōu)化/矢量化Python代碼(如Numpy函數(shù)所使用的)之間的對比。否則,本地Julia由于執(zhí)行編譯代碼,速度幾乎總是比Python快。同時,本地Python比執(zhí)行Numpy類型慢得多。
Numpy速度真的很快。它是一個擁有超優(yōu)化函數(shù)(大多已預編譯)的庫,專注于為Python用戶提供(對數(shù)據(jù)科學家和機器學習工程師特別有用)接近C語言的速度。簡單的Numpy函數(shù),如求和或標準差函數(shù)可以較好地匹配或打敗Julia等效組件(特別是較大的數(shù)組)。
然而,想要充分利用Numpy函數(shù),必須要考慮代碼的矢量化。在程序中,一直以矢量化代碼的形式編寫復雜邏輯很不容易。
因此,在將復雜邏輯應用于某種處理數(shù)組的情況下時,應該對Julia進行速度對比。
本文中將展示幾組相似例子以對這一點進行解釋。
然而,想要充分利用Numpy函數(shù),必須要考慮將代碼矢量化。
對于for循環(huán),Julia遠勝于Python
計算一百萬個隨機整數(shù)的和以驗證這一點。
Julia代碼如下。此函數(shù)所需時長稍多于1毫秒。
Python代碼如下。我們保留代碼的函數(shù)特性(Julia是函數(shù)語言)以保持對比的公平性,且便于驗證。For循環(huán)所需時長竟超過200毫秒!
但如何將Julia數(shù)組與Numpy數(shù)組進行比較呢? 在以上代碼中,創(chuàng)建一個數(shù)組變量。對于數(shù)據(jù)科學而言,這就是Julia中用途最大的數(shù)據(jù)結(jié)構(gòu),因為它能直接進行統(tǒng)計計算或線性代數(shù)運算。
無需單獨的庫或任何東西。Julia數(shù)組比Python列表快好幾個數(shù)量級。 但是,Numpy數(shù)組速度很快,一起對同樣的求和運算進行基準測試。
下方的Julia代碼使用數(shù)組上的sum()函數(shù)。它花費的時長約為451微秒(比for循環(huán)方法快,但只有一半的時間)。
下圖是由Numpy執(zhí)行。
天哪!Numpy僅需353微秒,它的速度打敗了Julia,而且比本地的Python for循環(huán)代碼快了近628倍。 所以,這一有利于Numpy的結(jié)論已經(jīng)確定了嗎?
還沒那么快。如果只想求出數(shù)組中奇數(shù)之和呢?
無需單獨的庫或任何東西。Julia數(shù)組比Python列表快好幾個數(shù)量級。
請看邏輯
對Julia而言,代碼更改相當簡單。本文將只使用for循環(huán),檢查數(shù)組中的元素是否能被2整除,如果不能(奇數(shù)),則將其添加至運行總和之中。盡可能地學究一點!
所以,這需要運行近4毫秒。
的確是比盲和(使用for循環(huán))慢,但也沒慢太多(for循環(huán)的純和約為1.1毫秒)。 現(xiàn)在,當然不能用這種速度與Python for循環(huán)競爭!結(jié)果顯而易見,不是嗎?所以,必須使用Numpy將代碼矢量化。
但是,該怎么檢查奇數(shù),然后在Numpy數(shù)組中對奇數(shù)求和呢?多虧有np.where()這一方法。
下圖是Python代碼。沒那么簡單(除非你知道如何正確使用np.where),是嗎?
但看一看速度。即使采用單行矢量化代碼的Numpy方法,平均用時也需16.7毫秒。
Julia代碼更為簡單,運行速度更快!
另一項略為復雜的運算
假設有三個數(shù)組(稱之為W、X和B),隨機浮點數(shù)在-2到2之間,想要計算一個特殊量:其中兩個數(shù)組的乘積與第三個數(shù)組相加,即A.X+B,但只有當元素的線性組合大于零時,才會將這個值添加到最終的和之中。
這個邏輯看著熟悉嗎?它是任何緊密連接的神經(jīng)網(wǎng)絡(甚至是單個感知器)的變體。其中權(quán)值、特征和偏差向量的線性組合必須超過某個閾值才能傳播到下一層。
下圖是Julia編碼。再一次地它的表現(xiàn)堪稱簡潔、完美。僅花費了約1.8毫秒。它使用了一個名為muladd()的特殊函數(shù),該函數(shù)將兩數(shù)字相乘并將數(shù)值與第三個數(shù)字相加。
使用Python以相似代碼(進行for循環(huán))進行嘗試,結(jié)果同預期一樣,慘不忍睹!平均花費時長超過1秒鐘。
再來一次,創(chuàng)新一下,使用Numpy矢量化代碼,結(jié)果比for循環(huán)案例要好得多,時長約為14.9毫秒,但還是不如Julia。
那么,結(jié)果如何呢?
至此,趨勢愈加明顯。對于數(shù)值運算,進行某些數(shù)學運算之前需要檢查復雜邏輯,Julia輕松地擊敗了Python(甚至Numpy),因為編寫邏輯時可以使用Julia中最簡單的代碼,然后把它忘掉。
得益于即時(JIT)編譯器和內(nèi)部類型相關優(yōu)化,它仍將以驚人的速度運行(Julia有一個極其復雜的類型系統(tǒng),可以使程序根據(jù)每個變量的正確數(shù)據(jù)類型快速運行,并優(yōu)化代碼和相應內(nèi)存)。
使用本地Python數(shù)據(jù)結(jié)構(gòu)和for循環(huán)編寫相同代碼的速度非常慢。隨著復雜程度提高,即使使用Numpy矢量化代碼,速度也遠低于Julia。
Numpy非常適合已經(jīng)附帶如sum()或mean()或std()等簡單方法的數(shù)組,但使用這些方法的同時還需使用邏輯,這并不簡單,還會嚴重拖慢運算速度。
在Julia中,無需費心思考代碼的矢量化。即使是看起來很愚蠢的代碼,使用簡單的for循環(huán)和元素對元素的邏輯檢查,運行速度也會非???!
對于數(shù)值運算,進行某些數(shù)學運算之前需要檢查復雜邏輯,Julia輕松地擊敗了Python(甚至Numpy),因為編寫邏輯時可以使用Julia中最簡單的代碼,然后便無需在意。
總結(jié)
本文展示了Julia和Python本地代碼與已優(yōu)化的Numpy函數(shù)之間數(shù)值運算的比較基準測試。 盡管就簡單函數(shù)而言,Numpy與Julia的速度不相上下,但在計算問題中引入復雜邏輯時,Julia更勝一籌。Julia代碼的編寫十分簡單,無需考慮函數(shù)的向量化。 隨著數(shù)據(jù)科學與機器學習支持系統(tǒng)的不斷發(fā)展,Julia是未來最令人期待的新語言之一。它是一個工具,是初級數(shù)據(jù)科學家都應掌握的技能。
圖源:Unsplash
你心動了嗎?快來試試備受褒獎的Julia吧~ 使用 Julia 從零開始構(gòu)建一項完整的數(shù)據(jù)科學應用。
你準備好了嗎?
留言 點贊 發(fā)個朋友圈
我們一起分享AI學習與發(fā)展的干貨
如需轉(zhuǎn)載,請后臺留言,遵守轉(zhuǎn)載規(guī)范


