Julia는 매우 추상적인 동적 프로그래밍 언어입니다. 모든 프로그램을 개발할 수 있는 범용 언어이기는 하지만 과학 컴퓨팅 및 수치 계산에 매우 적합한 몇 가지 기능을 갖추고 있습니다. Python은 1990년대 초반에 간단한 객체 지향 프로그래밍 언어로 등장했으며 오늘날 크게 발전했습니다. 이 기사에서는 신경망 및 기계 학습에서의 성능에 대해 설명합니다.
Julia의 아키텍처는 주로 동적 언어의 매개변수 다형성과 다중 디스패치의 프로그래밍 패러다임이 특징입니다. MPI(메시지 전달 인터페이스) 또는 내장된 "OpenMP 스타일" 스레드 유무에 관계없이 동시, 병렬 및 분산 컴퓨팅을 허용할 뿐만 아니라 추가 코드 없이 C 및 FORTRAN 라이브러리를 직접 호출할 수 있습니다. Julia는 실행하기 전에 기본적으로 모든 코드를 기계어 코드로 컴파일하기 때문에 Julia 커뮤니티에서 "JAOT(Just-Ahead-of-Time)"라고 부르는 JIT(Just-In-Time) 컴파일러를 사용합니다.
Python과 달리 Julia는 통계 및 기계 학습용으로 설계되었습니다. Julia는 선형 대수 연산을 빠르게 수행할 수 있지만 Python은 매우 느립니다. 이는 Python이 기계 학습에 사용되는 행렬과 방정식을 수용하도록 설계되지 않았기 때문입니다. Python 자체는 나쁘지 않습니다. 특히 Numpy는 패키지를 사용하지 않으면 Julia가 수학에 더 적합하다고 느낍니다. Julia의 연산자는 Python의 연산자보다 R과 유사하며 이는 상당한 이점입니다. 대부분의 선형 대수 연산은 더 적은 시간과 노력으로 수행할 수 있습니다.
우리 모두 알고 있듯이 Python은 최근 몇 년간 기계 학습 및 데이터 과학 분야를 장악해 왔습니다. Python에서는 다양한 타사 라이브러리를 사용하여 기계 학습 코드를 작성할 수 있기 때문입니다. Python에는 많은 장점이 있지만 여전히 한 가지 큰 단점이 있습니다. 즉, 해석된 언어이고 매우 느립니다. 이제는 데이터의 시대입니다. 데이터가 많을수록 처리하는 데 시간이 오래 걸리기 때문에 Julia가 등장합니다.
지금까지 Julia에 대한 연구 작업은 고성능 또는 Julia의 과학적 컴퓨팅 기능과 같은 주제에 중점을 두었습니다. 하지만 여기서는 복잡한 과학적 계산뿐만 아니라 비즈니스 기반 문제는 물론 기계 학습 및 Python과 같은 신경망을 효율적으로 처리하는 Julia의 능력에 대해 논의하겠습니다.
Julia는 Python만큼 간단하지만 C처럼 컴파일된 언어입니다. 먼저 Julia가 Python보다 얼마나 빠른지 테스트해 보겠습니다. 이를 위해 먼저 몇 가지 간단한 프로그램에서 테스트한 다음 실험의 초점을 맞춰 기계 학습 및 딥 러닝 기능을 테스트합니다.
Julia와 Python은 모두 많은 라이브러리와 오픈 소스 벤치마킹 도구를 제공합니다. Julia의 벤치마킹 및 컴퓨팅 시간을 위해 CPUTime
和 time
库;对于 Python,我们同样使用了 time
모듈을 사용했습니다.
처음에는 간단한 산술 연산을 시도했지만 이러한 연산은 시차가 크지 않았기 때문에 행렬 곱셈의 시차를 비교하기로 했습니다. 우리는 두 개의 (10 * 10)
그리고 내적을 합니다. 우리 모두 알고 있듯이 Python에는 Numpy
라이브러리, 종종 행렬과 벡터를 계산하는 데 사용됩니다. 그리고 Julia에는 LinearAlgebra
라이브러리, 일반적으로 행렬과 벡터를 계산하는 데 사용됩니다. 따라서 우리는 라이브러리가 있는 경우와 없는 경우에 각각 행렬 곱셈에 소요되는 시간을 비교했습니다. 이 문서에 사용된 모든 소스 코드는 GitHub 저장소에 있습니다. 아래는 Julia로 작성된 10×10 행렬 곱셈 프로그램입니다. (10 * 10)
的随机浮点数矩阵,并对它们施以点积。众所周知,Python 有一个 Numpy
库,常被用于计算矩阵和向量。而 Julia 也有一个 LinearAlgebra
库,常用于计算矩阵和向量。因此我们分别比较了各自使用和不使用库的矩阵乘法的耗时。本文用到的所有源码已经放在了 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 秒,使用循环耗时 0.000001 秒。
使用 Python 编写相同的矩阵乘法程序如下。 从结果可以发现,与不使用库相比,使用库的程序花费的时间更少:
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 秒,使用循环耗时 0.0015 秒。
我们进行的下一个实验是对十万个随机生成的数字进行线性搜索。这里使用了两种方法,一种是使用 for
循环,另一种是使用运算符。我们使用 1 到 1000 的整数执行了 1000 次搜索,正如你在下面的输出中看到的那样,我们还打印了我们在数据集中找到了多少个整数。下面给出了使用循环和使用 IN
运算符的时间。这里我们使用了 CPU 3 次运行时间的中位数。
使用 Julia 编写的程序和运行结果如下:
(LCTT 译注:此处原文缺失 Julia 代码)
使用 Python 编写的程序和运行结果如下:
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
从以上结果来看,在 Julia 中使用循环和运算符并不会产生显著的时间差异。但是在 Python 中循环几乎比运算符 IN 多花了三倍的时间。有趣的是,在这两种情况下,Julia 都比 Python 快得多。
下一个实验是测试机器学习算法。我们选择了以一种最常见和最简单的机器学习算法,使用简单数据集的线性回归。我们使用了一个包含 237 条数据的数据集 “Head Brain”,数据集的两列分别为 “HeadSize” 和 “BrainWeight”。接下来,我们使用 “head size” 数据去计算 “brain weight”。在 Python 和 Julia 中我们都没有使用第三方库,而是从零实现了线性回归算法。
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 所花费的时间。
接下来,我们使用两种语言的库对最常见的机器学习算法(即逻辑回归)进行了实验。对于 Python 我们使用最常见的库 sklearn
;对于 Julia,我们使用 GLM
@time log_rec() 0.027746 seconds (3.32 k allocations: 10.947 MiB)Julia는 라이브러리를 사용하여 0.000017초가 걸렸고 루프를 사용하면 0.000001초가 걸렸습니다. 다음과 같이 Python에서 동일한 행렬 곱셈 프로그램을 작성합니다. 결과에서 라이브러리를 사용하는 프로그램은 라이브러리를 사용하지 않는 것보다 시간이 덜 걸리는 것을 알 수 있습니다.
gc.collect() start = process_time() LogReg() end = process_time() print(end-start) Accuracy : 0.8068 0.34901400000000005Python은 라이브러리를 사용하면 0.0013초, 루프를 사용하면 0.0015초가 걸립니다. 🎜🎜선형 검색🎜🎜우리가 수행한 다음 실험은 무작위로 생성된 십만 개의 숫자에 대한 선형 검색이었습니다. 여기서는 두 가지 방법이 사용됩니다. 하나는
for
루프, 다른 하나는 연산자를 사용하는 것입니다. 우리는 1부터 1000까지의 정수를 사용하여 1000번의 검색을 수행했으며 아래 출력에서 볼 수 있듯이 데이터 세트에서 찾은 정수의 수도 인쇄했습니다. 아래에는 루프 사용법과 IN
연산자 시간. 여기서는 3개의 CPU 실행 시간의 중앙값을 사용합니다. 🎜🎜Julia를 사용하여 작성한 프로그램과 실행 결과는 다음과 같습니다. 🎜🎜 (LCTT 번역: 여기 원문에는 Julia 코드가 누락되어 있습니다.) 🎜🎜Python을 사용하여 작성된 프로그램과 실행 결과는 다음과 같습니다. 🎜Input ---> Hidden layer ---> Outputrrreee🎜From 위의 결과는 Julia 루프와 연산자를 사용하여 큰 시간 차이를 만들지 않습니다. 그러나 Python의 반복은 IN 연산자보다 거의 3배 더 오래 걸립니다. 흥미롭게도 두 경우 모두 Julia가 Python보다 훨씬 빠릅니다. 🎜🎜선형 회귀🎜🎜다음 실험은 기계 학습 알고리즘을 테스트하는 것입니다. 우리는 간단한 데이터 세트를 사용하여 가장 일반적이고 간단한 기계 학습 알고리즘 중 하나인 선형 회귀를 선택했습니다. 우리는 237개의 데이터가 포함된 데이터 세트 "Head Brain"을 사용했습니다. 데이터 세트의 두 열은 "HeadSize"와 "BrainWeight"입니다. 다음으로, “머리 크기” 데이터를 사용하여 “뇌 무게”를 계산합니다. Python과 Julia에서는 타사 라이브러리를 사용하지 않고 처음부터 선형 회귀 알고리즘을 구현했습니다. 🎜🎜Julia:🎜rrreee🎜Python:🎜rrreee🎜Julia와 Python에 소요된 시간은 위에 나와 있습니다. 🎜🎜로지스틱 회귀🎜🎜 다음으로 두 언어의 라이브러리를 사용하여 가장 일반적인 기계 학습 알고리즘인 로지스틱 회귀에 대한 실험을 수행했습니다. Python의 경우 가장 일반적인 라이브러리
sklearn
; Julia의 경우 GLM
라이브러리. 여기서 사용하는 데이터 세트는 은행 고객에 관한 것이며 10,000개의 데이터 항목을 포함합니다. 타겟변수는 소비자가 은행계좌를 계속 사용하는지를 구별하는 이진변수이다. 🎜🎜Julia에서 로지스틱 회귀를 수행하는 데 걸린 시간은 다음과 같습니다. 🎜rrreee 🎜Python에서 로지스틱 회귀를 수행하는 데 걸린 시간은 다음과 같습니다. 🎜gc.collect() start = process_time() LogReg() end = process_time() print(end-start) Accuracy : 0.8068 0.34901400000000005
在各种程序和数据集上测试这两种语言后,我们在神经网络上使用 MNIST 数据集继续测试它们。该数据集包含从零到九的手绘数字的灰度图像。每张图像为 28×28 像素。每个像素值表示该像素的亮度或暗度,该值是包含 0 到 255 之间的整数。该数据还包含一个标签列,该列表示在相关图像中绘制的数字。
Figure 1: Example of MNIST data set
图 1 是 MNIST 数据集的示例。
对两种语言我们都建立了一个简单的神经网络来测试它们耗费的时间。神经网络的结构如下:
Input ---> Hidden layer ---> Output
该神经网络包含了一个输入层、隐层还有输出层。为了避免神经网络的复杂度过高,我们对数据集没有进行任何的预处理工作。在 Julia 和 Python 中我们都进行了40次训练并比较它们的时间差异。
Figure 2: Julia takes 5.76 seconds in a neural network
在 Julia 中,Flux
库通常被用于建立神经网络;在 Python 中我们常使用 Keras
库。图 2 展示了 Julia 在神经网络上的耗时。图 3 展示了 Python 的神经网络经过了若干次训练的耗时。
Figure 3: Python takes 110.3 seconds in a neural network
这个结果展示了 Julia 和 Python 在处理神经网络时存在巨大的时间差异。
表 1 总结了此次实验的测试结果并计算了 Julia 和 Python 时间差异的百分比。
实验 |
Julia(秒) |
Python(秒) |
时间差(%) |
矩阵乘法(不使用库) |
0.000001 |
0.0015 |
99.9 |
행렬 곱셈(라이브러리 사용) |
0.000017 | 0.0013 |
98.69 |
선형 검색 (루프 사용) |
0.42 |
16.4 |
97.43 |
선형 검색(IN 연산자 사용) |
0.43 |
6.2 |
93.06 |
선형 회귀 |
0.000718 |
0.00718 | 90 |
로지스틱 회귀 |
0.025 |
0.34901 |
92.83 |
신경망 |
5 .76 |
110.3 |
94.77 |
우리가 수행한 모든 실험에서는 프로그램의 복잡성과 데이터 세트의 크기가 증가함에 따라 Julia와 Python의 실행 시간 차이가 증가하는 것으로 나타났습니다. 이 결과로부터 Julia가 기계 학습 및 신경망에 더 적합한 프로그래밍 언어임을 추론할 수 있습니다.
위 내용은 Julia와 Python 중 어느 것이 더 빠릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!