无论哪个规模的团队,在开发项目前,难免会通过多次会议讨论来确定最适合他们项目的编程语言。拿现在热门的语言来看,也难免会在近年来大火并且优点很多的golang以及老牌一直很常用的python之间纠结。
这篇文章,则从多个角度对比两种开发语言,希望能给正在纠结项目语言的你做参考,确定最适合你的语言
简要介绍
golang
Golang, 也就是我们常说的 Go,是由 Google 开发的一种计算机编程语言。Golang 是于 2007 年在 Google 开始开发的,2009 年面世。Go 语言的三位主要开发人员分别是 Google 的 Robert Geriesemer,Rob Pike 和 Ken Thompson。这几位一直以来的目标是创建一种语法上与 C 语言相似,又能像 C++ 一样消除「多余的垃圾」的语言。以致于 Go 语言包含现代多种语言的特性,如方法和运算符的重载、指针运算、类型继承。最终,造就了一个带有轻量并强大库以及拥有无敌的性能和速度的静态类型语言。
python
Python 是一种多用途的编程语言,换句话来说它几乎可以做任何事情。Python 是由一位荷兰程序员 Guido van Rossum 编写,于 1991 年首次发布。Python 最重要的一方面是它是一种高级编程语言,这意味着它非常易于学习和使用。这实际上是其背后的核心思想──将可读性放在首位。Pyhon提供了非常简单的语法,因此开发者几乎可以在不涉及底层编码的情况下完成绝大多数的编程任务。与此同时,Python也是一种面向对象语言。
主要区别
谈论到Golang和Python,先来了解一下这两个语言有什么区别
首先Golang是一种强类型静态类型的语言,而Python是一种动态类型的语言。到目前为止,虽然这两种类型的语言优缺点尚有争议,但大多数人似乎倾向于静态语言。静态语言能让程序更容易发现错误,并且更能确定程序执行的预期
语言特性来看,Golang的最大特点是天生支持异步,Golang的标准库把所有io操作都采用异步io实现,这样使得Golang的每个基于标准库开发的库都是支持异步,同时go自带了轻量级的协程,可以用很简单的方法实现多个任务异步执行; 而Python则是采用c语言的方法编写库,很多库不一定支持异步io,同时Python也不是天生支持异步的语言。
最重要的一点,GO和Python之间非常重要的区别是面向对象的支持。Python是完整的面向对象支持,Go只能说是面向接口的编程语言
性能
性能对于编程语言来说,就像是武功里面的力量,更强劲的性能意味着更少的资源,更快的速度,更稳定的业务
二分搜索
我们创建了一个整数列表(从1到100000),然后使用二分搜索查找始终相同的数字729。结果是:
冒泡排序
再次,我们生成了一个整数列表(这次是随机的,共10000个元素),并使用冒泡排序算法对其进行了排序。
文件读取
读取同一个文本文件的简单测试。
HTTP请求处理
一般go和python都应用在web场景,下面测试的是用web框架输出一个字符串 hello world所需的时间
以上来看,go在速度方面都领先python 数10倍有余,明显,性能方面,golang胜过python
并发和异步支持
如今,构建一个高可扩展性的应用是一门艺术。如果不做到扩展,那将对业务产生不利影响。Golang 在设计的时候便一直在考虑着这件事。Golang 的初衷是帮助 Google 的开发者解决内部大量的问题,这基本上涉及到成千上万的开发者在寄宿于成千上万集群的大型软件服务。这就是 Golang 具有内置支持并发进程通道(也就是并发性)的原因。而 Python 并不支持并发,它只是通过多线程来实现并行。
让我们来对比一下 golang协程和python多线程
并发(golang协程)
并发的意思是说,一个应用在多个任务里同时(并发地)处理多个进程。如果计算机只有一个 CPU,则应用程序可能无法在同一时间在多个任务上取得进展,但应用内的线程会在同一时间段内被执行。在下一个任务被执行之前,当前任务并没有完全完成(交替执行)。
并发执行:
并行(python多线程)
并行是说应用将它的任务分成多个能在同一时刻执行的多个子任务,把多个任务分配到不同的线程执行,一个线程只能跑一个任务,例如在多个 CPU 上同时执行。
并行执行:
一般如果采用并发模型,都会设计成一个任务执行中会在io等待的时候被其他任务抢占,这样就可以在单线程里面执行多个任务,每个任务的每个步骤在各个任务等待的间歇之间交错进行,这样cpu线程的利用率可以达到很高
而一般采用并行模型,则是多个任务绑定到多个cpu线程,每个任务在执行的时候一般是完成后别人才有机会绑定到线程执行,因此如果任务占用等待时间比较长,那么这个时间就不能被释放出来给其他任务所使用。
从当今趋势来看,并发执行能在一定时间用更少的线程完成更多的任务,更加符合现在的场景,尤其是微服务,在微服务场景,执行业务可能都要和其他接口打交道,这时候难免会有网络等待之类的时间间隙,如果支持并发模型,则可以好好利用这些时间间隙,因此天生支持异步和并发的golang会更加适合
可读性
当一个开发团队已经有一定规模,并且大家都是互相交叉着业务开发。这时,代码可读性会成为被大家考虑的重要因素。
因为python是面向对象语言,大部分人认为 Python 在可读性上更胜一筹。但是,实际在 Python 中,同一个功能,可能有 10 种不同的方式来表达,有的人守旧,用旧的实现,有的人喜欢用新特性,这会导致当代码很大或者协作的人很多时,由于不同风格,不同学习能力的人员开发代码后,造成的风格不统一,以后他人阅读会造成阅读理解困难
python中存在各种黑科技的写法
但是Golang 在编程的时候有着严格的规则约束,总体来看,也几乎没有什么很高级的操作,都是很简单易懂的代码规则。Golang的设计原则是用最简单的代码元素构建应用程序,因此,即使对于不同水平的人,看同一段代码,都可以轻松阅读的。
生态圈和应用
强大的库以及丰富的生态是开发者的福音,因为它能使我们的开发工作更容易。因此,拥有一个优秀的库对编程语言来说是至关重要的。在本节的比较中,Python 肯定以量获胜。比如可以让你使用数组来处理复杂的矩阵问题的 Numpy 库,专注深度学习的 Tensorflow 库和 Scikit Learn 库、针对图像处理的 OpenCV、数据分析的 Pandans、可视化的 matplotlib,等等等等 ~。讲真,如果 Python 仅是因为一件事而闻名,那必定是它的库。
在应用上,Python被广泛地用于数据分析、人工智能、深度学习以及 Web 开发。
python 使用广泛的工具和应用
但这并不意味着 Go 逊色于它。当 Go 在被开发的时候,Google 将一些很重要的库以内置的形式作为 Go 语言的一部分。虽然从数量上来讲没有 Python 的那么猛,但它的库所涉及的领域和 Python 是一样广的。它有针对 Web 开发(例如gin、beego)、数据库处理(mysql)、并发编程以及加密的强大的库。在云计算场景里面,Docker容器技术,Google开源著名的容器编排系统 Kubernetes,最近比较火的监控工具 Prometheus 等等这些业界功能强大的系统都是用Golang开发的
在应用上,Golang 更适合用于系统编程。这归结于它天然支持并发,在云计算和集群计算领域中使用广泛。同时由于golang打包出来仅仅只有一个二进制文件,这让Golang部署不像其他语言需要入侵系统环境,这样开发出来的系统级工具可以广泛运用到运维的场景,同时 Golang 也拥有强大易用的库,可以让你很快搭建出一个 Web 服务,并且天生支持并发能让Web服务更具有性能。
golang为云计算构建强大的生态
结论
结论是谁赢了呢?其实还是得看场景的,因为两种语言都在不同的场合有着重要的作用
Python的长处,数据统计分析,刚好就是golang的短板;而Golang的长处,在Python身上恰好又是短板。
如果我为了提高团队的web开发效率和生产力,因为更强的性能,更统一的代码风格,我会选择Golang