当前位置: 首页 > 科技观察

哪个更快,Julia还是Python?

时间:2023-03-15 16:59:04 科技观察

Julia是一种高度抽象的动态编程语言。虽然它是一种能够开发所有程序的通用语言,但它有几个特性使其成为科学和数值计算的理想选择。Python在1990年代初期作为一种简单的面向对象的编程语言出现,并取得了显着的发展。本文将讨论它们在神经网络和机器学习中的表现。Julia的体系结构的特点是参数多态性和动态语言中的多调??度编程范例。它允许使用或不使用消息传递接口(MPI)或内置“OpenMP样式”线程的并发、并行和分布式计算,以及直接调用C和FORTRAN库而无需额外代码。Julia使用即时(JIT)编译器,Julia社区将其称为“即时(JAOT)”,因为它在运行前默认将所有代码编译为机器码。与Python不同,Julia是专门为统计和机器学习而设计的。Julia可以快速执行线性代数运算,但Python非常慢。这是因为Python从未被设计为适应机器学习中使用的矩阵和方程式。Python本身并不差,尤其是Numpy,但不使用包,Julia更适合数学。Julia的运算符更像R的而不是Python的,这是一个显着的优势。大多数线性代数运算都可以用更少的时间和精力来执行。众所周知,Python近年来在机器学习和数据科学领域占据主导地位。因为在Python中我们可以使用各种第三方库来帮助我们编写机器学习代码。虽然Python有这么多优点,但它仍然有一个主要缺点——它是一种解释型语言,而且速度非常慢。现在是数据时代,我们拥有的数据越多,处理它的时间就越长,这就是Julia出现的原因。到目前为止,关于Julia的研究工作主要集中在高性能或Julia的科学计算能力等主题上。但在这里,我们将讨论Julia不仅可以有效处理复杂的科学计算,还可以处理基于业务的问题,以及像Python这样的机器学习和神经网络。实验目标和实验设计Julia和Python一样紧凑,但是像C一样是编译型语言。首先让我们测试一下Julia比Python快多少。为此,我们首先在一些简单的程序上对它们进行测试,然后来到我们实验的重点,测试它们的机器学习和深度学习能力。Julia和Python都提供了许多库和开源基准测试工具。对于Julia中的基准测试和计算时间,我们使用CPUTime和时间库;对于Python,我们还使用时间模块。矩阵乘法我们一开始尝试了简单的算术运算,但是由于这些运算在时间上差别不大,所以我们决定对比一下矩阵乘法的时间差。我们创建两个(10*10)随机浮点数矩阵并对它们进行点积。众所周知,Python有一个Numpy库,经常用来计算矩阵和向量。并且Julia还有一个LinearAlgebra库,常用于计算矩阵和向量。因此,我们比较了使用和不使用库的矩阵乘法的时间消耗。本文中使用的所有源代码都已放在GitHub存储库中。下面给出了一个用Julia编写的10×10矩阵乘法程序:@timeLinearAlgebra.mul!(c,x,y)functionMM()x=rand(Float64,(10,10))y=rand(Float64,(10,10))c=zeros(10,10)foriinrange(1,10)forjinrange(1,10)forkinrange(1,10)c[i,j]+=x[i,k]*y[k,j]endendendend@timeMM0.000001secondsMM(具有1个方法的通用函数)Julia使用库需要0.000017秒,使用循环需要0.000001秒。使用Python编写相同的矩阵乘法程序如下。从结果可以看出,带库的程序比不带库的程序耗时少:importnumpyasnpiimporttimeastx=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.001316070556640625importrandomimporttimeastl=0h=10cols=10rows=10choices=list(map(float,range(l,h)))x=[random.choices(choices,k=cols)for_inrange(rows)]y=[random.choices(choices,k=cols)for_inrange(rows)]result=[([0]*cols)foriinrange(rows)]start=t.time()foriinrange(len(x)):forjinrange(len(y[0])):forkinrange(len(result)):result[i][j]+=x[i][k]*y[k][j]print(result)print(“Time=",t.time()-start)Time=0.0015912055969238281Python使用库需要0.0013秒,使用循环需要0.0015秒。线性搜索我们进行的下一个实验是对十万个随机生成的数字进行线性搜索。这里使用了两种方法,一种是使用for循环,另一个是使用运算符。我们使用1到1000之间的整数执行了1000次搜索,正如您在下面的输出中看到的,我们还打印了我们在数据集中找到了多少个整数。下面给出了使用循环和使用IN运算符的时间。这里我们使用CPU3运行时间的中值。Julia写的程序及运行结果如下:(LCTT译注:此处原文缺少Julia代码)Python写的程序及运行结果如下:importnumpyasnpiimporttimeastx=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.001316070556640625importrandomimporttimeastl=0h=10cols=10rows=10choices=list(map(float,range(l,h)))x=[random.choices(choices,k=cols)for_in范围(行)]y=[随机。选择(选择,k=cols)对于_在范围(行)]result=[([0]*cols)对于我在范围(行)]start=t.time()对于我在范围(len(x)):对于范围内的j(len(y[0])):对于范围内的k(len(result)):结果[i][j]+=x[i][k]*y[k][j]print(result)print(“Time=“,t.time()-start)Time=0.0015912055969238281FOR_SEARCH:已用CPU时间:16.420260511secondsmatches:550ElapsedCPUtime:16.140975079secondsmatches:550ElapsedCPUtime:16.496360511secondsmatches:550ElapsedCPUtime:16.140975079secondsmatches:550ElapsedCPUtime:16.496360511secondsmatches:550ElapsedCPUtime:16.496360511secondsmatches:550ElapsedCPUtime:16.496360511secondsmatches:时间:6.446583343秒匹配:550已用CPU时间:6.216615487秒匹配:550ElapsedCPUtime:6.296716556secondsmatches:550从上面的结果来看,在Julia中使用循环和运算符没有显着的时间差异,但在Python循环中花费的时间几乎是运算符IN的三倍。有趣的是,Julia在这两种情况下都比Python快得多。线性回归下一个实验是测试机器学习算法。我们选择使用简单数据集的线性回归,这是最常见和最简单的机器学习算法之一。我们使用了包含237条数据的数据集“HeadBrain”,数据集的两列分别是“HeadSize”和“BrainWeight”。接下来,我们用“头围”数据来计算“脑重”。在Python和Julia中,我们都没有使用第三方库从头开始实现线性回归算法。Julia:GC.gc()@CPUtimebeginlinear_reg()结束CPU时间:0.000718秒Python:gc.collect()start=process_time()linear_reg()end=process_time()print(end-start)经过时间:0.007180344000000005上面给出花在Julia和Python上的时间。逻辑回归接下来,我们使用两种语言的库试验了最常见的机器学习算法,即逻辑回归。对于Python,我们使用最常见的库sklearn,对于Julia,我们使用GLM库。我们在这里使用的数据集是关于银行客户的信息,包含10,000个数据条目。目标变量是一个二元变量,用于区分消费者是否继续使用银行账户。Julia中逻辑回归所花费的时间如下:@timelog_rec()0.027746秒(3.32k分配:10.947MiB)Python中逻辑回归所花费的时间如下:gc.collect()start=process_time()LogReg()end=process_time()print(end-start)Accuracy:0.80680.34901400000000005神经网络在各种程序和数据集上测试了两种语言之后,我们继续使用MNIST数据集在神经网络上测试它们。该数据集包含从零到九的手绘数字的灰度图像。每幅图像为28×28像素。每个像素值表示该像素的亮度或暗度,并且是介于0和255之间的整数(含0和255)。数据还包含一个标签列,代表关联图像中绘制的图形。图1:MNIST数据集示例图1是MNIST数据集示例。我们为这两种语言构建了一个简单的神经网络来测试它们的耗时。神经网络的结构如下:Input--->Hiddenlayer--->Output神经网络包括输入层、隐藏层和输出层。为了避免神经网络过于复杂,我们没有对数据集进行任何预处理。在Julia和Python中,我们运行了40次训练并比较了它们的时间差异。图2:Julia在神经网络中耗时5.76秒在Julia中,通常使用Flux库来构建神经网络;在Python中,我们经常使用Keras库。图2显示了Julia在神经网络上的时间消耗。图3展示了Python神经网络多次耗时训练。图3:Python在神经网络中耗时110.3秒这个结果显示了Julia和Python在处理神经网络时的巨大时间差异。表1总结了这个实验的测试结果,并计算了Julia和Python时间的百分比差异。实验Julia(秒)Python(秒)时差(%)矩阵乘法(无库)0.0000010.001599.9矩阵乘法(有库)0.0000170.001398.69线性搜索(有循环)0.4216.497.43线性搜索(有IN运算符)0.436.293.06线性回归0.0007180.0071890逻辑回归0.0250.3490192.83神经网络5.76110.394.77我们进行的所有实验表明,随着程序复杂性和数据集大小的增加,Julia和Python之间的执行时间差异增加。从这个结果我们可以推断,Julia是一种更适合机器学习和神经网络的编程语言。