有人說Julia比Python好,還給出了5個理由
Julia 是一種多范式的函數(shù)式編程語言,用于機(jī)器學(xué)習(xí)和統(tǒng)計(jì)編程。盡管 Python 通常被認(rèn)為是一種面向?qū)ο蟮木幊陶Z言,其實(shí)它也是用于機(jī)器學(xué)習(xí)的多范式編程語言。需要注意的是,Julia 語言更多地基于函數(shù)范式。此外,Julia 語言雖不如 Python 那么流行,但在數(shù)據(jù)科學(xué)中使用 Julia 具有很大的優(yōu)勢,從而使它在很多情況下成為更好的編程語言選擇。
下文將從五個方面介紹 Julia 的優(yōu)勢所在。
速度
首先是速度,這是 Julia 語言引以為傲的一個重要方面。與 Python 需要解釋器來執(zhí)行代碼不同,Julia 主要是依托自身實(shí)現(xiàn)編譯。另一方面,與 C 語言等其他編譯語言也不同的是,Julia 在運(yùn)行時(shí)進(jìn)行編譯,而傳統(tǒng)語言則是在執(zhí)行前進(jìn)行編譯。如果 Julia 語言編寫地非常好,它的速度與 C 語言相當(dāng)、有時(shí)甚至可以超過 C 語言。Julia 語言使用即時(shí)編譯器 Just In Time(JIT)compiler,它的編譯速度非???,盡管它編譯時(shí)更像是一種解釋型語言而非 C 或 Fortran 等傳統(tǒng)低級編譯語言。
通用性
我們都知道通用性是 Python 語言相較于 Julia 語言的一個優(yōu)勢,確實(shí)有很多通過 Python 語言編寫的項(xiàng)目無法使用 Julia 來實(shí)現(xiàn)。當(dāng)然以上僅針對編程語言本身而言,我們這里提到的通用性是指能夠與其他語言混合編程。Julia 代碼普遍能夠在 R、Latex、Python 和 C 等語言中直接運(yùn)行。這意味著典型的數(shù)據(jù)科學(xué)項(xiàng)目具有一旦被編寫完成并在 Julia 本地進(jìn)行編譯后,在其他編程語言中作為封裝類或僅傳遞字符串使用的潛力。
PyCall 和 RCall 也是 Julia 語言的兩大優(yōu)勢??紤]到 Julia 語言一大缺點(diǎn)在于包的豐富程度不及 Python 或 R 語言,利用 PyCall 和 RCall 在 Julia 代碼中隨時(shí)調(diào)用 Python 和 R 為用戶提供了極大的便利。PyCall 在 Julia 語言中得到了很好地實(shí)現(xiàn),并且也非常有用。
多重派發(fā)
Julia 是一種非常獨(dú)特的類型化語言,具有自己的執(zhí)行模式和特征,但其中一個非常酷的特征是它的多重派發(fā)。首先,Julia 的多重派發(fā)速度非???。除此之外,使用 Julia 的多態(tài)派發(fā)能夠?qū)⒑瘮?shù)定義應(yīng)用為結(jié)構(gòu)屬性。這使得繼承(inheritance)在 Julia 內(nèi)部可行。不僅如此,使用 Julia 的多重派發(fā)還可以實(shí)現(xiàn)函數(shù)的擴(kuò)展,這對于包擴(kuò)展來說好處多多,因?yàn)闊o論什么時(shí)候顯式地導(dǎo)入 method,用戶都可以對它進(jìn)行更改。因此,用戶可以很容易地顯式導(dǎo)入自己的 method,并選擇相應(yīng)結(jié)構(gòu)將它擴(kuò)展為一個新的函數(shù)。
適用于 ML 的程度
與 Python 不同,Julia 語言的目的是應(yīng)用于統(tǒng)計(jì)學(xué)和機(jī)器學(xué)習(xí)領(lǐng)域。Python 語言則創(chuàng)建于 20 世紀(jì) 90 年代早期,是一種面向?qū)ο蟮恼Z言,并且自此之后也改變了很多。盡管 Python 具有很長的發(fā)展歷史以及廣泛的應(yīng)用范圍,但使用一種專門創(chuàng)建用于高級統(tǒng)計(jì)工作的語言能夠帶來很大的好處。
我認(rèn)為在線性代數(shù)中使用 Julia 要好于 Python。原生的 Python 只能緩慢完成線性代數(shù),而原生的 Julia 可以飛快地完成。這是因?yàn)?,Python 最開始并不是開發(fā)來用于支持與機(jī)器學(xué)習(xí)相關(guān)的所有矩陣和方程運(yùn)算的。這并不意味著 Python 不好,特別是當(dāng)有了 NumPy 擴(kuò)展庫之后。但就不導(dǎo)入額外擴(kuò)展庫而言,Julia 更適合于這類數(shù)學(xué)運(yùn)算。此外,與 Python 相比,Julia 的操作數(shù)系統(tǒng)與 R 語言的更為相近。使用 Julia 語言能夠更快速、更容易地完成大多數(shù)線性代數(shù)運(yùn)算,如以下代碼所示:
- Python -> y = np.dot(array1,array2)
- R -> y <- array1 * array2
- Julia -> y = array1 .* array2
包管理器
Julia 的 Pkg 包管理器秒殺 Python 的 Pip 包管理器。Pkg 自帶 REPL 和 Julia 包,你可以從中構(gòu)建、添加、移除、實(shí)例化包。因?yàn)?Pkg 和 Git 是綁定的使得以上操作尤其便利。更新、添加包都非常容易??傊?,比起 Python 的 Pip,Pkg 的使用體驗(yàn)在任何時(shí)候都要愉悅得多。
總結(jié)
R 也好,Julia 也好,Python 也好,你用什么語言其實(shí)沒那么重要。重要的是,你要知道每種語言都有它的劣勢,沒有哪種語言是無可挑剔的。特別是當(dāng)你的程序用途廣泛時(shí)尤為明顯(從機(jī)器學(xué)習(xí)到 GUI 到 API)。綜上所述,Julia 和 Python 一樣是我很喜歡的語言之一。Python 有更好的包,如果項(xiàng)目足夠小,我就會用 Python。但是對于擁有數(shù)百萬個觀察結(jié)果的數(shù)據(jù)集,用 Python 讀取數(shù)據(jù)都會變成一件難事。
總之,我對 Julia 的未來滿懷期待。Julia 寫起來很有趣,而且在未來的數(shù)據(jù)科學(xué)領(lǐng)域可能會變得更加實(shí)用。
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號“機(jī)器之心( id: almosthuman2014)”】