我最近写了一篇关于为什么我不担心Python失去用户的文章。几分钟后我被问到Python的使用,这篇文章没有提到,但却是一个发人深省的问题。我们看到未来使用Python的用户很可能会保持高位,但不能保证Python会被尽可能多的项目使用;用户(users)数量大且稳定,但Python在项目中的有用性(use)不确定。这篇文章的目的是帮助证明Python对于大多数软件项目来说仍然是可行的。我并不担心将Python与其他动态语言(如Ruby)相提并论,因为我认为争论是关于个人偏好的。这篇文章是为那些销售静态类型语言的人准备的。具体来说,这篇文章适用于Go,但也适用于任何其他静态类型语言。“为什么要去?”,你可能会问。因为Go实际上是在获取Python的用户。当Python在2003年到2005年之间的增长曲线是一根曲棍球棒时,Python不是被推下山的国王,而是失败者。Python传统上和Java一样从语言阵营获得用户,并留住他们(我不想说C++用户,因为通常他们有严格的性能需求,需要一门系统语言,或者是性能瘾君子,需要好好恢复).但是Go的情况就不同了。今天,Python是最常用的语言之一,不再是弱者。一旦静态类型语言社区中出现了一种具有相当好的生产力/性能折衷的语言,这应该足以说服一些Python程序员选择Go而不是Python。GoToday首先我应该说Go目前是我第二喜欢的语言。如果我今天要开始一个项目,并且不能说服人们使用Python,我会建议Go。当我在本文中说Go是一种糟糕的语言时,请不要误解我的意思。这篇文章的目的是要让其他人相信Python在生产力/性能权衡游戏中是Go的可行替代品,而不是要表达Go是一种糟糕的语言。认为这篇文章是反围棋是你个人的看法,不应该。我应该说我偶尔会在工作中使用Go,并且有点想关注该语言的社区。由于我不能凭想象成为Go专家,所以此声明并非仅从文档或博客中提取。但由于我是Python开发团队的一员,无论我如何努力做到公平,在某种程度上都存在固有偏见。因此,考虑到这些注意事项,让我们看看Go为开发人员提供了什么。生产力我看待Go的方式是,采用你最喜欢的编程语言并删除难以提高生产力的功能,这就是Go。静态类型的影响被最小化,因为您通常只在API边界面对它。结构类型也使事情变得更容易(将其视为鸭子类型)。语法并不笨拙(尽管它使用花括号)。不要认为Go是C/C++减去不安全的特性并添加一些更高效的东西,否则你会失望的(例如,“为什么我不能使用make()内置函数,并且不能makereturn像映射类型计数这样的值”,这是看待Go的错误方式;这就是C++开发人员还没有转向Go的原因)。快速编译还使开发周期更像是一种动态语言,而不是需要编译的语言。事实上,有些人喜欢没有异常机制带来的冗长,因为它促使你处理每一个异常情况,而不是(意外地)忽略它们(这在Go的初始系统语言设计中得到了例证)。此外,该语言本身相当简短且易于记忆,并且具有严格的前向兼容性要求(你不能更快地获得泛型),总的来说,用Gomatter编写代码是一种乐趣。由于是静态类型,Go可以轻松获得工具支持(它也有助于以前为此目的设计的语言)。Go确保核心工具遵循Go本身提供的工具也是明智的。gofmt强制执行Go风格的规则,并允许通过用户定义的规则重构代码(“缩进制表符”不再是一个问题,因为这意味着您可以将编辑器设置为代表制表符,但是您想要字符,然后gofmt转换它们到VCS的普通选项卡)。gofix将更新代码以与最新发布的版本保持一致。goget获取依赖项并安装它们。Go最大的生产力特性之一是它静态编译所有内容,使部署更简单。如果您使用容器进行开发和部署,这没什么大不了的。这仅在您分发单文件命令行工具而不是一组依赖项和您自己的代码时才有效。性能在性能方面,Go做得很好。很难指出任何基准可以明确证明Go始终是最快的选择,甚至计算机语言基准游戏中的一些基准也证明CPython3是最快的。但总的来说,对于你所做的任何工作,Go都可以被认为足够快。Go真正出色的地方在于并发性。请注意,并发代码不是并行代码,因为它通常被误解;并发代码仍然可以是单线程的,只是在任务切换时更容易/更好。Go通过使用goroutines使顺序并发代码执行变得绝对简单。如果你不想使用共享内存(尽管它也被支持),该语言提供的通信管道允许并发编程和非常简洁的消息传递。将所有特性集成到该语言中是尽可能使用该语言开发并发代码的另一个原因。换句话说,Go程序很快,并且该语言试图以合理的方式为您提供这种效果。今天的Python如果顺利的话我已经让你相信Go是一门优秀的编程语言,除非出于其他原因,有些人不会认为我通篇对Go的描述很糟糕。现在让我们讨论一下Python的生产力/性能是什么样的。生产力第一,Python非常容易学。这就是为什么Python是目前评价很高的美国大学首选的教学语言。这等同于拥有成熟稳定的语言新程序员来源,并且更容易培训其他程序员。我想说服某人只需几行Python代码就可以完成很多工作并不难(Go/Python3比较表明Python每次都用比Go更少的代码完成相同的工作)。所以我会坚持这样一个事实,即Python的效率更高,甚至与Go相比也是如此,并且没有人反对这一点。通常对Python的反对是在工具支持方面。但是,如果您注意到我指出的与Go相关的支持工具fmt、fix和get,那么Python社区也有等效工具。对于遵循PEP8的样式格式,请使用pep8进行提交检查,或者如果您想要更多gofmt样式的自动重写,则使用autopep8。gofixorgofmtforrefactoring,你可以说2to3也可以做到。对于goget,Python有pip。我们有代码冻结工具,如venv/virtualenv或cx_Freeze(在容器化之上,就像其他任何东西一样),而不是静态编译的二进制包。整个项目中甚至还有pylint之类的代码分析工具。说Python因为缺乏工具支持不能用于大型项目,在我看来很肤浅。如果说Python有哪一方面做得好,那一定是它丰富的第三方扩展库和可用的相应工具,就像你在PyPI上看到的那样(我相信有些人会忍不住争辩说,“不是所有的第三方库都可以在Python3上运行”,这是事实,但是,这些第三方扩展库对Python3的支持是相当不错的,并且还在不断完善中,所以我不会太介意争论,此外,你可以同时使用两个Python2/3版本来编码,你不需要关心是哪个版本)。看看godoc.org就会发现Go也不缺乏社区支持,而且Python有更多的第三方库可用,仅仅是因为它的年代久远,而且它将继续这样做。性能因为Python已经存在了很长时间并且变得如此庞大,简单地说“Python足够快”并不能说明全部,那是因为有多种方法可以实现加速。但是在深入研究VM级别的选项之后,这意味着Python的标准库提供了获得加速的选项。例如,concurrent.futures是执行非常简单的并行代码的笨拙方式。而在Python3.3中,新的asyncio编写异步代码。它没有像Go那样集成到语言中,用Python并发编程是可行的,而且在途中也不一定那么痛苦。但最好的方法是您可以在所选VM中更改Python代码的性能。
