志在指尖
用双手敲打未来

Go 和 Python 你更喜欢谁?

o言语降生于谷歌,由计算机范畴的三位宗师级大牛RobPike、KenThompson和RobertGriesemer写成。由于出身名门,Go在降生之初就吸收了大批开发者的关注。降生十年以来,曾经涌出了很多基于Go的应用。就在不多久之前,知乎也舍弃了Python,转用Go重构举荐系统。
谷歌前员工JakeWilson以为,比起大家熟习的Python,Go言语其实有很多优秀特性,很多时分都可以替代Python,他曾经在很多任务中运用Go言语替代了Python。那么Go言语到底有着什么样的共同魅力?它有哪些胜于Python的中央呢?让我们一同来了解一下吧!
再见,Python!你好,Go言语
出身名门的Go言语
关于一门只需十年历史的新言语,Go的展开势头相当迅猛,容器界的扛把子Docker就是用Go写的,国内也有不少团队普遍运用Go。近日,HackerRank在社区发起了程序员技艺调查,来自100多个国度、超越70000名开发者参与其中。调查结果显现,2019年,程序员最想学习的编程言语Top3分别是Go、Kotlin和Python,其中Go以37.2%的比例排在首位。
再见,Python!你好,Go言语
但Go要想撼动编程界的常青树Java二十多年的位置无疑问度颇大。据HackerRank数据显现,2018年,Java在开发者最受欢迎的编程言语排行榜中仍然排名第2,Python排名第4,Go排名第13,距离第一名JavaScript还有不小的差距。
但对本文作者JackWilson来说,Go言语固然“年岁尚小”,但曾经具有很多非常优秀的特性。Go 和 Python 你更喜欢谁?
Go言语到底好在哪?
在很多任务上,我曾经用Go言语替代了Python,举几个例子:
处置储存在S3上的云端日志
在S3上的bucket和/或region之间移动TB级别大小的文件
匹配本地的数据库记载和S3上的文件,以保证文件处于同步状态
这些任务大多是一次性的,所以运用脚本言语操作就会比较适合。这些任务需求快速地编程,而代码用过一次普通就舍弃了。普通来说,这种任务的需求都比较新颖、比较专,其代码很少需求复用。下面就来引见一下,针对这种任务为什么可以用Go言语来替代Python。
具有编译器很便当
我经常在写Python时犯很低级的错误。我会给变量或函数命错名,或向它们传送错误的参数。这样的错误用调试工具可以找出一部分,但这种工具普通需求特地设置。我历来没很便当地配置过pylint,而且我也不喜欢用那些很重的、配置起来更省事的IDE。最惨的情况是,你可能会不留神打错变量名,而这种错误又不太容易发现。你的脚本可能会跑好几个小时才遇上这个错误,然后一切都崩溃了,你又得从头开端跑这个脚本。这种错误大部分都可以靠单元测试检出,但单元测试很少能掩盖100%的代码,而且我并不想糜费时间去给一个只用一次的脚本写单元测试。而带编译器的言语就可以处置以上一切问题。编译器可以检测出你犯的一切低级错误。出于这点缘由,我在写长达几百行的代码时,更倾向于运用Go这类言语。
开发速度
但是,需求编译的言语的一个缺陷是,普通你的开发速度会降落。这点在C/C++和Java等言语上表现得特别明显。而Go是一个非常简单的言语,我发现它的开发速度并没有被拖慢几。不要误解,我的意义并不是说它比Python还快,而是想说,用Go言语没有比Python慢很多,普通抵达运用Python开发速度的85%还是没问题的。相关于具有编译器能避免的那些低级错误来说,我以为牺牲15%的开发速度还是很值的。
更好的并行性
你可能曾经知道,Go言语就是为并行而生的。在我的团队里经常会需求并行程序,由于我们要在S3上操作我们数据库中大量的数据。假设该任务是IO密集型的(理论上很多任务都是),我们就可以很容易地部署Python线程。但假设任务是CPU密集型的,用Python就比较不便当了,由于有全局解释器锁的存在。我非常享用在Go言语中简单代码不用修正就能直接多线程运转的直爽感。不知你在Python中有没有遇到过这种问题:直接复制粘贴的多线程代码却完好不工作。在Go言语中就不会有此问题。
部署简单
我比较喜欢把一切依赖放在单个二进制文件里。我经常在EC2效劳器上运转自己的脚本,好让环境愈加接近我们在S3上的效劳器。假设用Python的话,我需求保证一切需求的包都在效劳器上装好,而且我的同事不能在效劳器上装任何可能产生抵触的包。虚拟环境可以处置大部分问题,但我还是觉得用Go言语更便当。我普通是在Mac和Linux上交叉编译我的代码,将其拷贝到远程效劳器上,然后就可以任其运转了。我的代码所需求的一切依赖都在一个二进制文件里。
作风分歧
一开端,Go言语的格式化工具gofmt真实是让我抓狂,特别是它在代码缩进时恳求运用tab键而不是空格键。我觉得这简直是疯了。但是我用了一段时间后,就开端“真香”了。写代码时,我在格式上可以天马行空,格式化工具会帮我完成一切。我的一切代码作风都是分歧的,即使我是在写不同的项目。这是由于格式化是标准Go工具的一个特性。但我假设想在Python中完成这一点,就要费些劲儿了。我需求正确地配置pylint工具,并要保证在每一个项目中都运用它。
更便利的工具
Gofmt只是Go言语众多工具中的一个小例子。一切我喜欢用的编辑器——VSCode,vim和SublimeText中,都有Go言语相应的扩展,让我能够便当地享用到Go工具的优点。这样,我就能获得写Java时的那种智能体验,却不需求真正运用一个IDE。我在用Python时从未获得过这种体验。
Go言语当然也有缺陷
我每次看到批判Go言语的文章时,里面讲的几乎都是Go言语对关键特性的缺失,比如泛型。我倒是以为没有泛型没什么影响——你会发现,运用map和切片(Slice)就能完成多得惊人的操作。但是我在运用Go言语的过程中遇到了很多其他问题。
缺乏灵活性
首先,Go言语可能是我用过的言语里最“顽固”的言语了。比如,它除了会强迫你运用tab而不是空格键缩进(假定你用了gofmt工具),会强迫你运用特定的文件组织结构,还会强迫你在GOPATH环境变量中编程,如此等等。这种言语有太多难以改动的特性了。Go言语简单易学的缘由之一恐怕就是你不能改动这些特性。假设你不愿意将一切首字母大写的变量名export一遍,那真是负疚了。幸运的是,Go的这些特性倒是没有冒犯我的准绳底线,但是假设有人以为里面的某些恳求根本无法理喻,我也能够理解。相比之下Python就灵活多了。
库支持有点差劲
在这方面把Go言语和Python做比较有些不公平。Go的呈现比Python晚很多,但当我发现有些功用Go居然不支持的时分,还是觉得很困惑。我以致发现StackOverflow上很多人po出了本应该作为内置功用的代码段,而且大家都需求该功用,纷繁将代码复制粘贴到自己的项目下。这类功用不应该嵌入到言语内部吗?说到这里,我想到了近几年的两个例子:
给切片排序(幸运的是在Go1.8版本中这点便当多了)
Math.round只支持整数,不能中止浮点数的取整(比如你想找一个最接近0.5的整数,Go言语就无法完成)。以致在Go1.10版本之前,根本没有math.round函数
当然,这些问题的缘由有一部分是Go言语没有泛型,另一部分是由于Go的开发者们只给Go的标准库中添加最最必要的功用。
这两点我都理解,但是在遇到很小的问题却需求自己写代码处置时还是感到烦恼。
希望随着Go言语的展开,它的问题会变得越来越少。
Go和Python你更喜欢谁?欢迎留言交流!

未经允许不得转载:IT技术网站 » Go 和 Python 你更喜欢谁?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载