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