您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Julia 和 Python,哪一个更快?

时间:2022-10-02 20:12:48  来源:  作者:Linux

导读:本文将从它们在神经网络和机器学习的性能表现上进行讨论。

本文字数:6325,阅读时长大约: 8分钟

Julia 是一门高度抽象的动态编程语言。虽然它是一门能够开发所有程序的通用语言,但它有几个特点,非常适用于科学计算和数值计算。Python/ target=_blank class=infotextkey>Python 在 1990 年初作为一种简单的面向对象的程序语言出现,如今已经有了显著的发展。本文将从它们在神经网络和机器学习的性能表现上进行讨论。

Julia 的架构以动态语言中的参数多态性(parametric polymorphism)和多重派发(multiple dispatch)的编程范式为主要特色。它允许使用或不使用消息传递接口(message passing interface)(MPI)或内置的 “OpenMP 式” 线程进行并发、并行和分布式计算,以及直接调用 C 和 FORTRAN 库而无需额外的代码。Julia 使用 即时(just-in-time)(JIT)编译器,Julia 社区将其称为 “即时预编译(just-ahead-of-time)(JAOT)”,因为它在运行之前默认将所有代码编译为机器码。

与 Python 不同,Julia 是专为统计学和机器学习而设计的。Julia 可以快速的完成线性代数的运算,但 Python 很慢。这是因为 Python 从来都不是为了适应机器学习用到的矩阵和方程而设计的。Python 本身并不差,特别是 Numpy,但在没有使用包的情况下,Julia 更像是为数学量身定制的。相比 Python,Julia 的运算符更像 R,这是一个显著的优势。大部分的线性代数运算可以用更少的时间和精力去完成。

众所周知,近年来 Python 在机器学习和数据科学领域占据主导地位。因为在 Python 中我们可以使用各种各样的第三方库来帮助我们编写机器学习的代码。虽然 Python 有这么多优势,但仍有一个主要的缺点——它是一门解释性语言,速度非常慢。现在是数据时代,数据越多我们处理它的时间就越长,这也是 Julia 出现的理由。

到目前为止,有关 Julia 的研究工作都集中在高性能或者 Julia 的科学计算能力等主题上。但在这里,我们将讨论 Julia 不仅能够有效地处理复杂的科学计算,还能够处理基于商业的问题,以及像 Python 一样处理机器学习和神经网络。

实验目标与实验设计

Julia 像 Python 一样简洁,但却像 C 一样是一门编译语言。首先我们来测试 Julia 要比 Python 快多少。为此,我们先在一些简单的程序上测试它们,然后来到我们实验的重点,测试它们的机器学习和深度学习能力。

Julia 和 Python 都提供了许多库和开源的基准测试工具。为了在 Julia 中进行基准测试和计算时间,我们使用了CPUTimetime库;对于 Python,我们同样使用了time模块。

矩阵乘法

一开始我们尝试了简单的算术运算,但由于这些运算不会产生太大的时间差异,我们决定比较矩阵乘法的时间差异。我们创建了两个(10 * 10)的随机浮点数矩阵,并对它们施以点积。众所周知,Python 有一个Numpy库,常被用于计算矩阵和向量。而 Julia 也有一个LinearAlgebra库,常用于计算矩阵和向量。因此我们分别比较了各自使用和不使用库的矩阵乘法的耗时。本文用到的所有源码已经放在了 Github.com。下面给出了用 Julia 编写的 10×10 矩阵乘法程序:

 

  1.  

    @time LinearAlgebra.mul!(c,x,y)

     

  2.  

     

  3.  

    function MM()

     

  4.  

    x = rand(Float64,(10,10))

     

  5.  

    y = rand(Float64,(10,10))

     

  6.  

    c = zeros(10,10)

     

  7.  

     

  8.  

    for i in range(1,10)

     

  9.  

    for j in range(1,10)

     

  10.  

    for k in range(1,10)

     

  11.  

    c[i,j] += x[i,k]*y[k,j]

     

  12.  

    end

     

  13.  

    end

     

  14.  

    end

     

  15.  

    end

     

  16.  

    @time MM

     

  17.  

     

  18.  

    0.000001 seconds

     

  19.  

    MM (generic function with 1 method)

     

 

Julia 使用库耗时 0.000017 秒,使用循环耗时 0.000001 秒。

使用 Python 编写相同的矩阵乘法程序如下。 从结果可以发现,与不使用库相比,使用库的程序花费的时间更少:

 

  1.  

    import numpy as np

     

  2.  

    import time as t

     

  3.  

    x = np.random.rand(10,10)

     

  4.  

    y = np.random.rand(10,10)

     

  5.  

    start = t.time()

     

  6.  

    z = np.dot(x, y)

     

  7.  

    print(“Time = “,t.time()-start)

     

  8.  

    Time = 0.001316070556640625

     

  9.  

     

  10.  

    import random

     

  11.  

    import time as t

     

  12.  

    l = 0

     

  13.  

    h= 10

     

  14.  

    cols = 10

     

  15.  

    rows= 10

     

  16.  

     

  17.  

    choices = list (map(float, range(l,h)))

     

  18.  

    x = [random.choices (choices , k=cols) for _ in range(rows)]

     

  19.  

    y = [random.choices (choices , k=cols) for _ in range(rows)]

     

  20.  

     

  21.  

    result = [([0]*cols) for i in range (rows)]

     

  22.  

     

  23.  

    start = t.time()

     

  24.  

     

  25.  

    for i in range(len(x)):

     

  26.  

    for j in range(len(y[0])):

     

  27.  

    for k in range(len(result)):

     

  28.  

    result[i][j] += x[i][k] * y[k][j]

     

  29.  

     

  30.  

    print(result)

     

  31.  

    print(“Time = “, t.time()-start)

     

  32.  

     

  33.  

    Time = 0.0015912055969238281

     

 

Python 使用库耗时 0.0013 秒,使用循环耗时 0.0015 秒。

线性搜索

我们进行的下一个实验是对十万个随机生成的数字进行线性搜索。这里使用了两种方法,一种是使用for循环,另一种是使用运算符。我们使用 1 到 1000 的整数执行了 1000 次搜索,正如你在下面的输出中看到的那样,我们还打印了我们在数据集中找到了多少个整数。下面给出了使用循环和使用IN运算符的时间。这里我们使用了 CPU 3 次运行时间的中位数。

使用 Julia 编写的程序和运行结果如下:

(LCTT 译注:此处原文缺失 Julia 代码)

使用 Python 编写的程序和运行结果如下:

 

  1.  

    import numpy as np

     

  2.  

    import time as t

     

  3.  

    x = np.random.rand(10,10)

     

  4.  

    y = np.random.rand(10,10)

     

  5.  

    start = t.time()

     

  6.  

    z = np.dot(x, y)

     

  7.  

    print(“Time = “,t.time()-start)

     

  8.  

    Time = 0.001316070556640625

     

  9.  

     

  10.  

    import random

     

  11.  

    import time as t

     

  12.  

    l = 0

     

  13.  

    h= 10

     

  14.  

    cols = 10

     

  15.  

    rows= 10

     

  16.  

     

  17.  

    choices = list (map(float, range(l,h)))

     

  18.  

    x = [random.choices (choices , k=cols) for _ in range(rows)]

     

  19.  

    y = [random.choices (choices , k=cols) for _ in range(rows)]

     

  20.  

     

  21.  

    result = [([0]*cols) for i in range (rows)]

     

  22.  

     

  23.  

    start = t.time()

     

  24.  

     

  25.  

    for i in range(len(x)):

     

  26.  

    for j in range(len(y[0])):

     

  27.  

    for k in range(len(result)):

     

  28.  

    result[i][j] += x[i][k] * y[k][j]

     

  29.  

     

  30.  

    print(result)

     

  31.  

    print(“Time = “, t.time()-start)

     

  32.  

     

  33.  

    Time = 0.0015912055969238281

     

  1.  

    FOR_SEARCH:

     

  2.  

    Elapsed CPU time: 16.420260511 seconds

     

  3.  

    matches: 550

     

  4.  

    Elapsed CPU time: 16.140975079 seconds

     

  5.  

    matches: 550

     

  6.  

    Elapsed CPU time: 16.49639576 seconds

     

  7.  

    matches: 550

     

  8.  

     

  9.  

    IN:

     

  10.  

    Elapsed CPU time: 6.446583343 seconds

     

  11.  

    matches: 550

     

  12.  

    Elapsed CPU time: 6.216615487 seconds

     

  13.  

    matches: 550

     

  14.  

    Elapsed CPU time: 6.296716556 seconds

     

  15.  

    matches: 550

     

 

从以上结果来看,在 Julia 中使用循环和运算符并不会产生显著的时间差异。但是在 Python 中循环几乎比运算符 IN 多花了三倍的时间。有趣的是,在这两种情况下,Julia 都比 Python 快得多。

线性回归

下一个实验是测试机器学习算法。我们选择了以一种最常见和最简单的机器学习算法,使用简单数据集的线性回归。我们使用了一个包含 237 条数据的数据集 “Head BrAIn”,数据集的两列分别为 “HeadSize” 和 “BrainWeight”。接下来,我们使用 “head size” 数据去计算 “brain weight”。在 Python 和 Julia 中我们都没有使用第三方库,而是从零实现了线性回归算法。

Julia:

 

  1.  

    GC.gc()

     

  2.  

    @CPUtime begin

     

  3.  

    linear_reg()

     

  4.  

    end

     

  5.  

    elapsed CPU time: 0.000718 seconds

     

 

Python:

 

  1.  

    gc.collect()

     

  2.  

    start = process_time()

     

  3.  

    linear_reg()

     

  4.  

    end = process_time()

     

  5.  

     

  6.  

    print(end-start)

     

  7.  

    elapsed time: 0.007180344000000005

     

 

上面给出了 Julia 和 Python 所花费的时间。

逻辑回归

接下来,我们使用两种语言的库对最常见的机器学习算法(即逻辑回归)进行了实验。对于 Python 我们使用最常见的库sklearn;对于 Julia,我们使用GLM库。我们在这里用到的数据集是有关银行客户的信息,其中包含 10,000 个数据条目。目标变量是一个二元变量,区分消费者是否继续使用银行账户。

下面给出了 Julia 进行逻辑回归所花费的时间:

 

  1.  

    @time log_rec()

     

  2.  

    0.027746 seconds (3.32 k allocations: 10.947 MiB)

     

 

下面给出了 Python 进行逻辑回归所花费的时间:

 

  1.  

    gc.collect()

     

  2.  

    start = process_time()

     

  3.  

    LogReg()

     

  4.  

    end = process_time()

     

  5.  

    print(end-start)

     

  6.  

     

  7.  

    Accuracy : 0.8068

     

  8.  

    0.34901400000000005

     

 

神经网络

在各种程序和数据集上测试这两种语言后,我们在神经网络上使用 MNIST 数据集继续测试它们。该数据集包含从零到九的手绘数字的灰度图像。每张图像为 28×28 像素。每个像素值表示该像素的亮度或暗度,该值是包含 0 到 255 之间的整数。该数据还包含一个标签列,该列表示在相关图像中绘制的数字。

Figure 1: Example of MNIST data set

图 1 是 MNIST 数据集的示例。

对两种语言我们都建立了一个简单的神经网络来测试它们耗费的时间。神经网络的结构如下:

 

  1.  

    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 是一门更适合机器学习和神经网络的编程语言。

via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

LCTT 译者 :Songling Gu

翻译: 3.0 篇

贡献: 61 天

2022-07-31

2022-09-30

https://linux.cn/lctt/Return7g

欢迎遵照 CC-BY-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。



Tags:Julia   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Julia 和 Python,哪一个更快?
导读:本文将从它们在神经网络和机器学习的性能表现上进行讨论。本文字数:6325,阅读时长大约: 8分钟Julia 是一门高度抽象的动态编程语言。虽然它是一门能够开发所有程序的通用语...【详细内容】
2022-10-02  Search: Julia  点击:(418)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条