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