新聞中心
Julia 是一門高度抽象的動(dòng)態(tài)編程語(yǔ)言。雖然它是一門能夠開(kāi)發(fā)所有程序的通用語(yǔ)言,但它有幾個(gè)特點(diǎn),非常適用于科學(xué)計(jì)算和數(shù)值計(jì)算。Python 在 1990 年初作為一種簡(jiǎn)單的面向?qū)ο蟮某绦蛘Z(yǔ)言出現(xiàn),如今已經(jīng)有了顯著的發(fā)展。本文將從它們?cè)谏窠?jīng)網(wǎng)絡(luò)和機(jī)器學(xué)習(xí)的性能表現(xiàn)上進(jìn)行討論。

成都創(chuàng)新互聯(lián)公司擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕十載,專業(yè)且經(jīng)驗(yàn)豐富。十載網(wǎng)站優(yōu)化營(yíng)銷經(jīng)驗(yàn),我們已為上千家中小企業(yè)提供了成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站解決方案,定制制作,設(shè)計(jì)滿意,售后服務(wù)無(wú)憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!
Julia 的架構(gòu)以動(dòng)態(tài)語(yǔ)言中的參數(shù)多態(tài)性parametric polymorphism和多重派發(fā)multiple dispatch的編程范式為主要特色。它允許使用或不使用消息傳遞接口message passing interface(MPI)或內(nèi)置的 “OpenMP 式” 線程進(jìn)行并發(fā)、并行和分布式計(jì)算,以及直接調(diào)用 C 和 FORTRAN 庫(kù)而無(wú)需額外的代碼。Julia 使用 即時(shí)just-in-time(JIT)編譯器,Julia 社區(qū)將其稱為 “即時(shí)預(yù)編譯just-ahead-of-time(JAOT)”,因?yàn)樗谶\(yùn)行之前默認(rèn)將所有代碼編譯為機(jī)器碼。
與 Python 不同,Julia 是專為統(tǒng)計(jì)學(xué)和機(jī)器學(xué)習(xí)而設(shè)計(jì)的。Julia 可以快速的完成線性代數(shù)的運(yùn)算,但 Python 很慢。這是因?yàn)?Python 從來(lái)都不是為了適應(yīng)機(jī)器學(xué)習(xí)用到的矩陣和方程而設(shè)計(jì)的。Python 本身并不差,特別是 Numpy,但在沒(méi)有使用包的情況下,Julia 更像是為數(shù)學(xué)量身定制的。相比 Python,Julia 的運(yùn)算符更像 R,這是一個(gè)顯著的優(yōu)勢(shì)。大部分的線性代數(shù)運(yùn)算可以用更少的時(shí)間和精力去完成。
眾所周知,近年來(lái) Python 在機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)領(lǐng)域占據(jù)主導(dǎo)地位。因?yàn)樵?Python 中我們可以使用各種各樣的第三方庫(kù)來(lái)幫助我們編寫機(jī)器學(xué)習(xí)的代碼。雖然 Python 有這么多優(yōu)勢(shì),但仍有一個(gè)主要的缺點(diǎn)——它是一門解釋性語(yǔ)言,速度非常慢。現(xiàn)在是數(shù)據(jù)時(shí)代,數(shù)據(jù)越多我們處理它的時(shí)間就越長(zhǎng),這也是 Julia 出現(xiàn)的理由。
到目前為止,有關(guān) Julia 的研究工作都集中在高性能或者 Julia 的科學(xué)計(jì)算能力等主題上。但在這里,我們將討論 Julia 不僅能夠有效地處理復(fù)雜的科學(xué)計(jì)算,還能夠處理基于商業(yè)的問(wèn)題,以及像 Python 一樣處理機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)。
實(shí)驗(yàn)?zāi)繕?biāo)與實(shí)驗(yàn)設(shè)計(jì)
Julia 像 Python 一樣簡(jiǎn)潔,但卻像 C 一樣是一門編譯語(yǔ)言。首先我們來(lái)測(cè)試 Julia 要比 Python 快多少。為此,我們先在一些簡(jiǎn)單的程序上測(cè)試它們,然后來(lái)到我們實(shí)驗(yàn)的重點(diǎn),測(cè)試它們的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)能力。
Julia 和 Python 都提供了許多庫(kù)和開(kāi)源的基準(zhǔn)測(cè)試工具。為了在 Julia 中進(jìn)行基準(zhǔn)測(cè)試和計(jì)算時(shí)間,我們使用了 ??CPUTime?? 和 ??time?? 庫(kù);對(duì)于 Python,我們同樣使用了 ??time?? 模塊。
矩陣乘法
一開(kāi)始我們嘗試了簡(jiǎn)單的算術(shù)運(yùn)算,但由于這些運(yùn)算不會(huì)產(chǎn)生太大的時(shí)間差異,我們決定比較矩陣乘法的時(shí)間差異。我們創(chuàng)建了兩個(gè) ??(10 * 10)?? 的隨機(jī)浮點(diǎn)數(shù)矩陣,并對(duì)它們施以點(diǎn)積。眾所周知,Python 有一個(gè) ??Numpy?? 庫(kù),常被用于計(jì)算矩陣和向量。而 Julia 也有一個(gè) ??LinearAlgebra?? 庫(kù),常用于計(jì)算矩陣和向量。因此我們分別比較了各自使用和不使用庫(kù)的矩陣乘法的耗時(shí)。本文用到的所有源碼已經(jīng)放在了 ??GitHub 存儲(chǔ)庫(kù)??。下面給出了用 Julia 編寫的 10×10 矩陣乘法程序:
@time LinearAlgebra.mul!(c,x,y)
function MM()
x = rand(Float64,(10,10))
y = rand(Float64,(10,10))
c = zeros(10,10)
for i in range(1,10)
for j in range(1,10)
for k in range(1,10)
c[i,j] += x[i,k]*y[k,j]
end
end
end
end
@time MM
0.000001 seconds
MM (generic function with 1 method)
Julia 使用庫(kù)耗時(shí) 0.000017 秒,使用循環(huán)耗時(shí) 0.000001 秒。
使用 Python 編寫相同的矩陣乘法程序如下。 從結(jié)果可以發(fā)現(xiàn),與不使用庫(kù)相比,使用庫(kù)的程序花費(fèi)的時(shí)間更少:
import numpy as np
import time as t
x = np.random.rand(10,10)
y = np.random.rand(10,10)
start = t.time()
z = np.dot(x, y)
print(“Time = “,t.time()-start)
Time = 0.001316070556640625
import random
import time as t
l = 0
h= 10
cols = 10
rows= 10
choices = list (map(float, range(l,h)))
x = [random.choices (choices , k=cols) for _ in range(rows)]
y = [random.choices (choices , k=cols) for _ in range(rows)]
result = [([0]*cols) for i in range (rows)]
start = t.time()
for i in range(len(x)):
for j in range(len(y[0])):
for k in range(len(result)):
result[i][j] += x[i][k] * y[k][j]
print(result)
print(“Time = “, t.time()-start)
Time = 0.0015912055969238281
Python 使用庫(kù)耗時(shí) 0.0013 秒,使用循環(huán)耗時(shí) 0.0015 秒。
線性搜索
我們進(jìn)行的下一個(gè)實(shí)驗(yàn)是對(duì)十萬(wàn)個(gè)隨機(jī)生成的數(shù)字進(jìn)行線性搜索。這里使用了兩種方法,一種是使用 ??for?? 循環(huán),另一種是使用運(yùn)算符。我們使用 1 到 1000 的整數(shù)執(zhí)行了 1000 次搜索,正如你在下面的輸出中看到的那樣,我們還打印了我們?cè)跀?shù)據(jù)集中找到了多少個(gè)整數(shù)。下面給出了使用循環(huán)和使用 ??IN?? 運(yùn)算符的時(shí)間。這里我們使用了 CPU 3 次運(yùn)行時(shí)間的中位數(shù)。
使用 Julia 編寫的程序和運(yùn)行結(jié)果如下:
(LCTT 譯注:此處原文缺失 Julia 代碼)
使用 Python 編寫的程序和運(yùn)行結(jié)果如下:
import numpy as np
import time as t
x = np.random.rand(10,10)
y = np.random.rand(10,10)
start = t.time()
z = np.dot(x, y)
print(“Time = “,t.time()-start)
Time = 0.001316070556640625
import random
import time as t
l = 0
h= 10
cols = 10
rows= 10
choices = list (map(float, range(l,h)))
x = [random.choices (choices , k=cols) for _ in range(rows)]
y = [random.choices (choices , k=cols) for _ in range(rows)]
result = [([0]*cols) for i in range (rows)]
start = t.time()
for i in range(len(x)):
for j in range(len(y[0])):
for k in range(len(result)):
result[i][j] += x[i][k] * y[k][j]
print(result)
print(“Time = “, t.time()-start)
Time = 0.0015912055969238281
FOR_SEARCH:
Elapsed CPU time: 16.420260511 seconds
matches: 550
Elapsed CPU time: 16.140975079 seconds
matches: 550
Elapsed CPU time: 16.49639576 seconds
matches: 550
IN:
Elapsed CPU time: 6.446583343 seconds
matches: 550
Elapsed CPU time: 6.216615487 seconds
matches: 550
Elapsed CPU time: 6.296716556 seconds
matches: 550
從以上結(jié)果來(lái)看,在 Julia 中使用循環(huán)和運(yùn)算符并不會(huì)產(chǎn)生顯著的時(shí)間差異。但是在 Python 中循環(huán)幾乎比運(yùn)算符 IN 多花了三倍的時(shí)間。有趣的是,在這兩種情況下,Julia 都比 Python 快得多。
線性回歸
下一個(gè)實(shí)驗(yàn)是測(cè)試機(jī)器學(xué)習(xí)算法。我們選擇了以一種最常見(jiàn)和最簡(jiǎn)單的機(jī)器學(xué)習(xí)算法,使用簡(jiǎn)單數(shù)據(jù)集的線性回歸。我們使用了一個(gè)包含 237 條數(shù)據(jù)的數(shù)據(jù)集 “Head Brain”,數(shù)據(jù)集的兩列分別為 “HeadSize” 和 “BrainWeight”。接下來(lái),我們使用 “head size” 數(shù)據(jù)去計(jì)算 “brain weight”。在 Python 和 Julia 中我們都沒(méi)有使用第三方庫(kù),而是從零實(shí)現(xiàn)了線性回歸算法。
Julia:
GC.gc()
@CPUtime begin
linear_reg()
end
elapsed CPU time: 0.000718 seconds
Python:
gc.collect()
start = process_time()
linear_reg()
end = process_time()
print(end-start)
elapsed time: 0.007180344000000005
上面給出了 Julia 和 Python 所花費(fèi)的時(shí)間。
邏輯回歸
接下來(lái),我們使用兩種語(yǔ)言的庫(kù)對(duì)最常見(jiàn)的機(jī)器學(xué)習(xí)算法(即邏輯回歸)進(jìn)行了實(shí)驗(yàn)。對(duì)于 Python 我們使用最常見(jiàn)的庫(kù) ??sklearn??;對(duì)于 Julia,我們使用 ??GLM?? 庫(kù)。我們?cè)谶@里用到的數(shù)據(jù)集是有關(guān)銀行客戶的信息,其中包含 10,000 個(gè)數(shù)據(jù)條目。目標(biāo)變量是一個(gè)二元變量,區(qū)分消費(fèi)者是否繼續(xù)使用銀行賬戶。
下面給出了 Julia 進(jìn)行邏輯回歸所花費(fèi)的時(shí)間:
@time log_rec()
0.027746 seconds (3.32 k allocations: 10.947 MiB)
下面給出了 Python 進(jìn)行邏輯回歸所花費(fèi)的時(shí)間:
gc.collect()
start = process_time()
LogReg()
end = process_time()
print(end-start)
Accuracy : 0.8068
0.34901400000000005
神經(jīng)網(wǎng)絡(luò)
在各種程序和數(shù)據(jù)集上測(cè)試這兩種語(yǔ)言后,我們?cè)谏窠?jīng)網(wǎng)絡(luò)上使用 MNIST 數(shù)據(jù)集繼續(xù)測(cè)試它們。該數(shù)據(jù)集包含從零到九的手繪數(shù)字的灰度圖像。每張圖像為 28×28 像素。每個(gè)像素值表示該像素的亮度或暗度,該值是包含 0 到 255 之間的整數(shù)。該數(shù)據(jù)還包含一個(gè)標(biāo)簽列,該列表示在相關(guān)圖像中繪制的數(shù)字。
Figure 1: Example of MNIST data set
圖 1 是 MNIST 數(shù)據(jù)集的示例。
對(duì)兩種語(yǔ)言我們都建立了一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)來(lái)測(cè)試它們耗費(fèi)的時(shí)間。神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)如下:
Input ---> Hidden layer ---> Output
該神經(jīng)網(wǎng)絡(luò)包含了一個(gè)輸入層、隱層還有輸出層。為了避免神經(jīng)網(wǎng)絡(luò)的復(fù)雜度過(guò)高,我們對(duì)數(shù)據(jù)集沒(méi)有進(jìn)行任何的預(yù)處理工作。在 Julia 和 Python 中我們都進(jìn)行了40次訓(xùn)練并比較它們的時(shí)間差異。
Figure 2: Julia takes 5.76 seconds in a neural network
在 Julia 中,??Flux?? 庫(kù)通常被用于建立神經(jīng)網(wǎng)絡(luò);在 Python 中我們常使用 ??Keras?? 庫(kù)。圖 2 展示了 Julia 在神經(jīng)網(wǎng)絡(luò)上的耗時(shí)。圖 3 展示了 Python 的神經(jīng)網(wǎng)絡(luò)經(jīng)過(guò)了若干次訓(xùn)練的耗時(shí)。
Figure 3: Python takes 110.3 seconds in a neural network
這個(gè)結(jié)果展示了 Julia 和 Python 在處理神經(jīng)網(wǎng)絡(luò)時(shí)存在巨大的時(shí)間差異。
表 1 總結(jié)了此次實(shí)驗(yàn)的測(cè)試結(jié)果并計(jì)算了 Julia 和 Python 時(shí)間差異的百分比。
|
實(shí)驗(yàn) |
Julia(秒) |
Python(秒) |
時(shí)間差(%) |
|
矩陣乘法(不使用庫(kù)) |
0.000001 |
0.0015 |
99.9 |
|
矩陣乘法(使用庫(kù)) |
0.000017 |
0.0013 |
98.69 |
|
線性搜索(使用循環(huán)) |
0.42 |
16.4 |
97.43 |
|
線性搜索(使用 IN 操作符) |
0.43 |
6.2 |
93.06 |
|
線性回歸 |
0.000718 |
0.00718 |
90 |
|
邏輯回歸 |
0.025 |
0.34901 |
92.83 |
|
神經(jīng)網(wǎng)絡(luò) |
5.76 |
110.3 |
94.77 |
我們進(jìn)行的所有實(shí)驗(yàn)都表明,隨著程序復(fù)雜性以及數(shù)據(jù)集大小的增加,Julia 和 Python 之間的執(zhí)行時(shí)間差異也會(huì)增加。由這個(gè)結(jié)果我們可以推斷,Julia 是一門更適合機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的編程語(yǔ)言。
網(wǎng)站題目:Julia和Python,哪一個(gè)更快?
標(biāo)題路徑:http://m.fisionsoft.com.cn/article/dhpejdc.html


咨詢
建站咨詢
