面对超高速复杂逻辑束手无策?试试Julia吧!
云栖号:https://www.aliyun.com/#module-yedOfott8
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!
图源:Unsplash
Julia是什么?
“操作似Python,运行如C语言”。
没错,这就是Julia素有的口号。
Julia作为一种现代编程语言,主攻科学计算,它是一种灵活的动态型语言,其性能可与传统的静态型语言相媲美。目前其追随者和使用其的开发人员日益增多。
Julia试图提供一种单一环境,此环境的生产能力足以进行原型设计,并能有效地应用于工业级应用程序。它是一种多范式语言,其中包含函数式和面向对象式编程组件,尽管大多数的用户都喜欢其函数式编程的功能。
该编程语言的起源可追溯至2009年。首席开发人员Alan Edelman、Jeff Bezanson、Stefan Karpinski和Viral Shah着手创建该语言,以用于更快更好的数值计算。2012年2月,开发人员发布了该语言的一个商业版本。
为什么Julia对数据科学而言如此优越?
Julia是数据科学和机器学习工作的最佳选择,两者原因大致相同,即它在数值快速计算方面最为适用。优点如下:
· 平滑的学习曲线和大量的基础功能。特别是,如果你已经很熟悉如Python、R语言等更为热门的数据科学语言后,学习Julia就好似在公园中散步一样容易。
· 性能:Julia最初是一种编译语言,而Python和R语言是解释语言。这就意味着Julia代码以可直接处理代码的形式在处理器上运行。
· GPU支持:这与性能直接相关。GPU支持由某些软件包,如TensorFlow.jl和MXNet.jl公开控制。
· 分布式和并行式计算支持:Julia使用多种拓扑公开执行并行式与分布式计算。它还支持协同程序,比如在GO编程语言中,协同程序是在多核架构中并行工作的辅助函数。Julia广泛支持线程和同步旨在最优化性能、降低竞争风险。
· 丰富的数据科学与可视化库:Julia社区认为其是数据科学家和统计学家的首选语言。因此,主攻数据科学与分析的高性能库一直处于开发状态。
· 团队合作(与其它语言/框架共同使用):在数据科学和机器学习领域,Julia和其它成熟语言及框架的兼容性相当好。使用PyCall或RCall可以在Julia脚本中使用本地Python或R语言代码。Plots包可以与包括Matplotlib和Plotly的各种端协同工作。Scikit-learn或TensorFlow等热门机器学习库已经具有类似Julia的语言或包装器。
· 用户友好的界面:不论是在本地还是云上,Julia 的用户界面都非常友好,在所有的流程中,用户与 Julia 的交流都非常顺畅。Julia 还对所有的功能和数据类型提供了方便易用的帮助文件。
· 与其他语言无缝对接:这些语言包括(但不限于)R、Python 和 C。这使你不需要进行完整的迁移,就可以使用现有的代码库。
综上,Julia是数据科学和机器学习工作的最佳选择,两者原因大致相同,即它在数值快速计算方面最为适用。
具体案例与比较,Julia优势一目了然
使用Python脚本进行基准测试
有关“Julia比Python速度快吗?”这一问题存在诸多争议。
与生活中其它事情类似,答案是:视情况而定。
图源:Unsplash
官方Julia语言门户网站上有些相关数据,尽管基准测试是针对Python以外的各种语言进行的。
事实上,这个问题总是认为人们所谈论的是Julia与某种优化/矢量化Python代码(如Numpy函数所使用的)之间的对比。否则,本地Julia由于执行编译代码,速度几乎总是比Python快。同时,本地Python比执行Numpy类型慢得多。
Numpy速度真的很快。它是一个拥有超优化函数(大多已预编译)的库,专注于为Python用户提供(对数据科学家和机器学习工程师特别有用)接近C语言的速度。简单的Numpy函数,如求和或标准差函数可以较好地匹配或打败Julia等效组件(特别是较大的数组)。
然而,想要充分利用Numpy函数,必须要考虑代码的矢量化。在程序中,一直以矢量化代码的形式编写复杂逻辑很不容易。
因此,在将复杂逻辑应用于某种处理数组的情况下时,应该对Julia进行速度对比。
本文中将展示几组相似例子以对这一点进行解释。
然而,想要充分利用Numpy函数,必须要考虑将代码矢量化。
对于for循环,Julia远胜于Python
计算一百万个随机整数的和以验证这一点。
Julia代码如下。此函数所需时长稍多于1毫秒。
Python代码如下。我们保留代码的函数特性(Julia是函数语言)以保持对比的公平性,且便于验证。For循环所需时长竟超过200毫秒!
但如何将Julia数组与Numpy数组进行比较呢?
在以上代码中,创建一个数组变量。对于数据科学而言,这就是Julia中用途最大的数据结构,因为它能直接进行统计计算或线性代数运算。
无需单独的库或任何东西。Julia数组比Python列表快好几个数量级。
但是,Numpy数组速度很快,一起对同样的求和运算进行基准测试。
下方的Julia代码使用数组上的sum()函数。它花费的时长约为451微秒(比for循环方法快,但只有一半的时间)。
下图是由Numpy执行。
天哪!Numpy仅需353微秒,它的速度打败了Julia,而且比本地的Python for循环代码快了近628倍。
所以,这一有利于Numpy的结论已经确定了吗?
还没那么快。如果只想求出数组中奇数之和呢?
无需单独的库或任何东西。Julia数组比Python列表快好几个数量级。
请看逻辑
对Julia而言,代码更改相当简单。本文将只使用for循环,检查数组中的元素是否能被2整除,如果不能(奇数),则将其添加至运行总和之中。尽可能地学究一点!
所以,这需要运行近4毫秒。的确是比盲和(使用for循环)慢,但也没慢太多(for循环的纯和约为1.1毫秒)。
现在,当然不能用这种速度与Python for循环竞争!结果显而易见,不是吗?所以,必须使用Numpy将代码矢量化。
但是,该怎么检查奇数,然后在Numpy数组中对奇数求和呢?多亏有np.where()这一方法。
下图是Python代码。没那么简单(除非你知道如何正确使用np.where),是吗?
但看一看速度。即使采用单行矢量化代码的Numpy方法,平均用时也需16.7毫秒。
Julia代码更为简单,运行速度更快!
另一项略为复杂的运算
假设有三个数组(称之为W、X和B),随机浮点数在-2到2之间,想要计算一个特殊量:其中两个数组的乘积与第三个数组相加,即A.X+B,但只有当元素的线性组合大于零时,才会将这个值添加到最终的和之中。
这个逻辑看着熟悉吗?它是任何紧密连接的神经网络(甚至是单个感知器)的变体。其中权值、特征和偏差向量的线性组合必须超过某个阈值才能传播到下一层。
下图是Julia编码。再一次地它的表现堪称简洁、完美。仅花费了约1.8毫秒。它使用了一个名为muladd()的特殊函数,该函数将两数字相乘并将数值与第三个数字相加。
使用Python以相似代码(进行for循环)进行尝试,结果同预期一样,惨不忍睹!平均花费时长超过1秒钟。
再来一次,创新一下,使用Numpy矢量化代码,结果比for循环案例要好得多,时长约为14.9毫秒,但还是不如Julia。
那么,结果如何呢?
至此,趋势愈加明显。对于数值运算,进行某些数学运算之前需要检查复杂逻辑,Julia轻松地击败了Python(甚至Numpy),因为编写逻辑时可以使用Julia中最简单的代码,然后把它忘掉。
得益于即时(JIT)编译器和内部类型相关优化,它仍将以惊人的速度运行(Julia有一个极其复杂的类型系统,可以使程序根据每个变量的正确数据类型快速运行,并优化代码和相应内存)。
使用本地Python数据结构和for循环编写相同代码的速度非常慢。随着复杂程度提高,即使使用Numpy矢量化代码,速度也远低于Julia。
Numpy非常适合已经附带如sum()或mean()或std()等简单方法的数组,但使用这些方法的同时还需使用逻辑,这并不简单,还会严重拖慢运算速度。
在Julia中,无需费心思考代码的矢量化。即使是看起来很愚蠢的代码,使用简单的for循环和元素对元素的逻辑检查,运行速度也会非常快!
对于数值运算,进行某些数学运算之前需要检查复杂逻辑,Julia轻松地击败了Python(甚至Numpy),因为编写逻辑时可以使用Julia中最简单的代码,然后便无需在意。
总结
本文展示了Julia和Python本地代码与已优化的Numpy函数之间数值运算的比较基准测试。
尽管就简单函数而言,Numpy与Julia的速度不相上下,但在计算问题中引入复杂逻辑时,Julia更胜一筹。Julia代码的编写十分简单,无需考虑函数的向量化。
随着数据科学与机器学习支持系统的不断发展,Julia是未来最令人期待的新语言之一。它是一个工具,是初级数据科学家都应掌握的技能。
图源:Unsplash
你心动了吗?快来试试备受褒奖的Julia吧~
使用 Julia 从零开始构建一项完整的数据科学应用。
你准备好了吗?
原文发布时间:2019-1-07
本文作者:读芯术
本文来自阿里云云栖号合作伙伴“读芯术”,了解相关信息可以关注“读芯术”
云栖号:https://www.aliyun.com/#module-yedOfott8
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
懂技术!混圈子!双十二拼团大咖灰太狼教你如何流量变现!
大家好,我叫灰太狼,在一家互联网公司担任程序员一职,但是正不正经我就不大清楚了。比起最近在群内接触到的称霸拼团赛榜首的大佬们,我只是一枚刚入门云大使两三个月的萌新,但在这次双十一和双十二拼团赛中,我结合自身的优势,也找到了最适合自己的推广方式,成为云大使这段时间也有不少的感悟,现在就来与大家分享一下。 我也像很多其他程序员小伙伴一样,平时没有什么特别花时间的爱好,对于闲暇时间针对专业知识和工作的思考,我喜欢用写文章的方式记录下来,在个人公众号中与志同道合的小伙伴们分享交流技术,当然也有一些时事热点(欢迎大家去公众号关注我,与我多多交流,公众号ID:Python乱炖)。在我看来,写技术文章不仅可以不断为自己沉淀经验与知识,还可以帮助到不少渴望知识渴望成长的人,这是一件十分有意义的事情。 在了解到这个云计算普惠全国的阿里云大使项目前,也有不少同学来咨询我,问我服务器该怎么买,结合他们的具体情况,我都很耐心一一为他们解答,推荐产品。还是一个偶然的机会,阿里云官方运营同学发现了我的公众号,邀请我加入阿里云大使,在此之前我也是阿里云的用户,对阿里云的产品十分信任,并且推荐新人购买还有不菲的佣金可...
- 下一篇
【科创人独家】知道创宇杨冀龙:技术人的商业思维都是锤出来的,真实需求长在客户的KPI上
采访开始之前,杨冀龙非常老江湖地整了一套口头版《用户协议》:话有多少、言有轻重,成稿的时候请留意,《科创人》果断点勾确认。 2007~2019,深耕网络安全行业12年,没有不可说之经历才是怪事。可即便是有码+渣画质,也是足斤足量的干货与诚意。 2007~2009 网络安全服务 很多技术人理想中的创业模式:自由多金,工作内容稳定不变。可对需求端来说,你做一样的事,他自然就提一样的要求,高级技术外包也还是外包,苦逼依旧。 2007年,杨冀龙与赵伟(知道创宇CEO)等几个朋友玩游戏,玩着玩着赵伟萌生了创业的想法,哥几个一合计,咱擅长的就是网络安全,出来也继续做这事。 对彼时的中国互联网安全行业而言,知道创宇的创始团队堪称银河战舰,**当年中国黑客排行榜Top 50,知道创宇6位创始人全部在榜。**非常团队自然要行非常之事,比起一般创业者风餐露宿着跑业务、拉客户,知道创宇起手阶段就是承接国家科研课题,订单不愁。 如是两年,收入丰裕、生活稳定,可杨冀龙觉得不是滋味儿,离开奋斗了8年的绿盟是想成就一番自己的事业,可如今做着所谓“高级服务外包”,除了技术含量高一些,本质上与任何一家外包公司没有不同:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装