Go vs Python,我该选哪一门语言?

简介: 哪个更好,Python 还是 Go?你今天应该学习哪种语言,为什么?两者在性能、易学习性、可扩展性和快速原型设计方面如何比较?让我们在 Python 和 Go 的这个友好且易于访问的概述中找出答案。

Python 和 Go 都很棒

首先,真的有必要说,Go 和 Python 都是绝对优秀的编程语言。它们设计精良,功能强大,现代,相对易学,是几乎所有应用的理想选择。两者都拥有强大的社区,广泛的应用,蓬勃发展的生态系统以及高商业价值。

无论你最喜欢哪一个,都是最值得学习的。你可能会想,讨论结束,但让我们再说一点。


读到诸如 "为什么 Python 很烂",或者 "为什么我们从 Go 转到 Python "之类的博文是很常见的。不客气地说,这些文章对于理解可能影响你选择的 Python 和 Go 的特性并不特别有价值,而且它们通常想论证一种语言更好。


image.png


但这真的毫无意义。对什么更好?任何编程语言都自然而然地代表了一系列的权衡:比如说,速度与安全的关系,或者是易学与正确性的关系。不同的语言会做出不同的权衡。你可以有把握地假设,任何广泛使用的语言,如 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 之间的选择时,只有你的意愿是重要的。

相关文章
|
5月前
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
1070 103
|
4月前
|
API C++ 开发者
PySide vs PyQt:Python GUI开发史诗级对决,谁才是王者?
PySide 和 PyQt 是 Python GUI 开发领域的两大利器,各有特色。PySide 采用 LGPL 协议,更灵活;PyQt 默认 GPL,商业使用需授权。两者背后团队实力雄厚,PySide 得到 Qt 官方支持,PyQt 由 Riverbank Computing 打造。API 设计上,PySide 简洁直观,贴近原生 Qt;PyQt 增加 Pythonic 接口,操作更高效。性能方面,两者表现优异,适合不同需求的项目开发。选择时可根据项目特点与开源要求决定。
293 20
|
5月前
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比
|
6月前
|
移动开发 JavaScript 前端开发
精通服务器推送事件(SSE)与 Python 和 Go 实现实时数据流 🚀
服务器推送事件(SSE)是HTML5规范的一部分,允许服务器通过HTTP向客户端实时推送更新。相比WebSocket,SSE更轻量、简单,适合单向通信场景,如实时股票更新或聊天消息。它基于HTTP协议,使用`EventSource` API实现客户端监听,支持自动重连和事件追踪。虽然存在单向通信与连接数限制,但其高效性使其成为许多轻量级实时应用的理想选择。文中提供了Python和Go语言的服务器实现示例,以及HTML/JavaScript的客户端代码,帮助开发者快速集成SSE功能,提升用户体验。
|
7月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
1月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
1月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
2月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
2月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
173 0
|
3月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。

推荐镜像

更多