哪个更好,Python 还是 Go?你今天应该学习哪种语言,为什么?两者在性能、易学习性、可扩展性和快速原型设计方面如何比较?让我们在 Python 和 Go 的这个友好且易于访问的概述中找出答案,该概述由For the Love of Go 系列丛书的作者撰写。
首先,真的有必要说,Go 和 Python 都是绝对优秀的编程语言。它们设计精良,功能强大,现代,相对易学,是几乎所有应用的理想选择。两者都拥有强大的社区,广泛的应用,蓬勃发展的生态系统以及高商业价值。
无论你最喜欢哪一个,都是最值得学习的。你可能会想,讨论结束,但让我们再说一点。
读到诸如 "为什么 Python 很烂",或者 "为什么我们从 Go 转到 Python "之类的博文是很常见的。不客气地说,这些文章对于理解可能影响你选择的 Python 和 Go 的特性并不特别有价值,而且它们通常想论证一种语言更好。
但这真的毫无意义。对什么更好?任何编程语言都自然而然地代表了一系列的权衡:比如说,速度与安全的关系,或者是易学与正确性的关系。不同的语言会做出不同的权衡。你可以有把握地假设,任何广泛使用的语言,如 Go 或 Python,平均来说,和其他语言一样好......但也许在不同的事情上。
因此,让我们抛开这个错误的两难选择,即要么选择 Go,要么选择 Python。我们可以学习和使用这两种语言;这两种语言在不同的领域都很出色,而且从职业的角度来看,这两种语言都是非常有价值的技能。然而,假设你有有限的学习和练习时间,了解你想从事的开发领域偏爱哪种语言会有帮助。
因此,让我们看看编程的一些不同领域,看看哪种语言更适合每个领域。
如果你是编程新手,你可能会从你的编程语言中寻找不同的东西,比如说,想为深空探测器写操作系统的人。例如,你可能想要一种简洁的语言,没有大量的语法需要学习,或者一种灵活的语言,让你以任何感觉最自然的方式表达自己。
Go 是一门刻意缩小的语言;例如,它没有很多不同的方式来做同一件事,而且语言中也没有很多三方工具来涵盖你可能想要做的每一件事。相比之下,Python 有很多功能:类、lambda 、元组、迭代器、生成器,以及更多。
然而,Python 的语法感觉相当自然;它看起来像这样。
for path in paths:
if path == '-':
text = sys.stdin.read()
else:
fp = codecs.open(path, 'r', opts.encoding)
text = fp.read()
fp.close()
Go 很简单,但简单并不等同于容易。如果你是新手,可能很难弄清楚某段 Go 代码在做什么。
func (forceApi *ForceApi) getApiSObjects() error {
uri := forceApi.apiResources[sObjectsKey]
list := &SObjectApiResponse{}
err := forceApi.Get(uri, nil, list)
if err != nil {
return err
}
另一方面,虽然一开始可能更有挑战性,但你很快就会达到熟悉 Go 中一切的程度。要达到这个阶段,Python 需要更长的时间,因为有更多的东西需要学习。
然而,如果你正在迈出编程的第一步,使用 Python 可能会是一个更容易和更愉快的经历。
如果你是编程新手,你可能会惊讶地发现,对于大多数程序来说,性能几乎不重要。一般来说,可读性和可维护性要比原始速度重要得多。但是,当性能确实重要时,在游戏、数据库或大规模网络服务等应用中,它真的很重要。
Go 是一种编译语言,这意味着 Go 的源代码会被翻译成机器语言,供你在特定的处理器上运行:ARM 芯片、X86_64,或者其他。
这使得 Go 程序总体上比 Python 中的同等程序快得多。Python 是一种解释语言,这意味着它不直接在 CPU 上执行。相反,另一个程序,即解释器,读取 Python 源代码,并将其即时翻译成机器指令。
需要注意的是,对于你所写的 99% 的程序来说,性能远没有简单性和可读性重要,如果你碰巧需要写一些执行速度非常快的程序,Go 将是你的第一选择。
科学家,包括数据科学家、机器学习开发者,以及需要做复杂数值和统计分析的人,都喜欢 Python。它已经存在了很长时间,并且为科学计算建立了一个伟大的生态系统:数学、统计、人工智能、模拟、图像处理、分布式处理等等。这些库和社区非常成熟,并提供了大量的资源。
并不是说你不能用 Go 做这些事情,而是人们在 Python 中做这些事情的时间更长,它或多或少拥有这个空间。如果你在做科学和工程应用,你几乎肯定会用 Python 做。
当我们谈论 "扩展性"时,我们通常意味着很多事情发生得非常快:每秒数百万次的交易,成千上万的服务器,数千兆字节的数据。这给程序员带来了一些挑战:他们需要他们的程序快速、小巧、易于部署和操作,而且最好对并发有很好的支持。
这些都是 Go 非常强大的领域。正如我们所看到的,Go 程序是经过编译的,所以它们的执行速度自然很快,而且它们可以作为一个小的二进制文件来部署。相比之下,Python 程序是以源代码的形式部署的,而且它们还需要 Python 解释器、库等等。即使使用容器,用 Go 来大规模部署和运行应用程序也要容易得多。
Go 从一开始也是为并发而设计的。它支持超轻量级的线程,称为 goroutines,一个程序可以同时运行数百万个 goroutines 而不会产生问题。虽然 Python 支持并发进程和线程,但使用起来比 Go 要复杂一些,而且性能也没有那么好。
对于大规模、低延迟的应用,尤其是涉及大量并发的应用,Go 是你应该首先关注的语言。
在软件开发中很常见的是,我们事先并没有对程序的所有详细要求。相反,我们只想让一些东西运行起来,证明这个概念,并给我们一个简单的原型,我们可以向用户展示,这样我们就可以得到反馈。
Python 是一种优秀的快速原型语言;我们可以把我们的想法以一种几乎看起来像英语的形式快速写下来,而且所产生的程序可能会运行,或多或少。Python 的动态类型是非常宽容的;它意味着你不需要确切地知道什么是什么,就可以处理它。
相比之下,Go 是相当严格的。它是静态类型的,这意味着编译器坚持事先验证你传递给一个函数的每一个值,比如说,正是它应该有的类型。这可能会使编程经验感觉有点像在做大量的文书工作,只是为了让一个简单的概念证明运行。
对于超快速的原型开发、实验和用快速脚本解决一次性问题,Python 是理想的选择。
我希望这篇文章能让你相信 Python 和 Go 都值得你认真考虑。如果可能的话,你应该争取在这两种语言中至少获得一定程度的经验,因为这对你在任何技术职业中都是非常有用的,甚至如果你把编程作为一种爱好的话。
你现在知道的足够多了,可以拒绝所有旨在说服你相信 Go 或 Python 在某种绝对方式上比另一个更好的点击率文章,或者至少用非常挑剔的眼光来阅读它们,并理解它们在很大程度上只是表达作者的个人偏好。
这没关系:编程是一项非常主观和个人的活动,你用你最喜欢的语言比用一个计算机科学家小组认为理论上优越的语言更有成效。另外,你也不会觉得有必要写博客文章侮辱那些喜欢不同语言的人;你明白他们只是对不同事情的优先考虑。
因此,你同时尝试 Python 和 Go,看看你更喜欢用哪种语言编程,真的很有意义,不是吗?当你写了一堆玩具程序或编码挑战,也许每种语言都有一个非简单的程序,你就能更好地决定你想优先学习哪种语言了。
最后一点:好的程序员就是一个好的程序员,无论他们现在用什么语言工作。作为一名软件开发人员,你所学到的大多数技能都可以很好地转化为其他语言和技术栈,所以今天选择学习什么并不重要。
忽略那些炒作的言论,跳过那些过度炒作的博客文章,让你自己决定:当涉及到 Python 和 Go 之间的选择时,只有你的意愿是重要的。
领取专属 10元无门槛券
私享最新 技术干货