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

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


咨詢
建站咨詢
