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 之间的选择时,只有你的意愿是重要的。

相关文章
|
1天前
|
Shell 数据处理 C++
【震撼揭秘】Python正则VS Shell正则:一场跨越编程边界的史诗级对决!你绝不能错过的精彩较量,带你领略文本处理的极致魅力!
【8月更文挑战第19天】正则表达式是文本处理的强大工具,在Python与Shell中有广泛应用。两者虽语法各异,但仍共享许多基本元素,如`.`、`*`及`[]`等。Python通过`re`模块支持丰富的功能,如非捕获组及命名捕获组;而Shell则依赖`grep`、`sed`和`awk`等命令实现类似效果。尽管Python提供了更高级的特性和函数,Shell在处理文本文件方面仍有其独特优势。选择合适工具需根据具体需求和个人偏好决定。
|
1天前
|
安全 Java Go
探索Go语言在高并发环境中的优势
在当今的技术环境中,高并发处理能力成为评估编程语言性能的关键因素之一。Go语言(Golang),作为Google开发的一种编程语言,以其独特的并发处理模型和高效的性能赢得了广泛关注。本文将深入探讨Go语言在高并发环境中的优势,尤其是其goroutine和channel机制如何简化并发编程,提升系统的响应速度和稳定性。通过具体的案例分析和性能对比,本文揭示了Go语言在实际应用中的高效性,并为开发者在选择合适技术栈时提供参考。
|
5天前
|
运维 Kubernetes Go
"解锁K8s二开新姿势!client-go:你不可不知的Go语言神器,让Kubernetes集群管理如虎添翼,秒变运维大神!"
【8月更文挑战第14天】随着云原生技术的发展,Kubernetes (K8s) 成为容器编排的首选。client-go作为K8s的官方Go语言客户端库,通过封装RESTful API,使开发者能便捷地管理集群资源,如Pods和服务。本文介绍client-go基本概念、使用方法及自定义操作。涵盖ClientSet、DynamicClient等客户端实现,以及lister、informer等组件,通过示例展示如何列出集群中的所有Pods。client-go的强大功能助力高效开发和运维。
24 1
|
6天前
|
SQL 关系型数据库 MySQL
Go语言中使用 sqlx 来操作 MySQL
Go语言因其高效的性能和简洁的语法而受到开发者们的欢迎。在开发过程中,数据库操作不可或缺。虽然Go的标准库提供了`database/sql`包支持数据库操作,但使用起来稍显复杂。为此,`sqlx`应运而生,作为`database/sql`的扩展库,它简化了许多常见的数据库任务。本文介绍如何使用`sqlx`包操作MySQL数据库,包括安装所需的包、连接数据库、创建表、插入/查询/更新/删除数据等操作,并展示了如何利用命名参数来进一步简化代码。通过`sqlx`,开发者可以更加高效且简洁地完成数据库交互任务。
13 1
|
5天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
7天前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
1天前
|
监控 NoSQL Go
Go语言中高效使用Redis的Pipeline
Redis 是构建高性能应用时常用的内存数据库,通过其 Pipeline 和 Watch 机制可批量执行命令并确保数据安全性。Pipeline 类似于超市购物一次性结账,减少网络交互时间,提升效率。Go 语言示例展示了如何使用 Pipeline 和 Pipelined 方法简化代码,并通过 TxPipeline 保证操作原子性。Watch 机制则通过监控键变化实现乐观锁,防止并发问题导致的数据不一致。这些机制简化了开发流程,提高了应用程序的性能和可靠性。
5 0
|
3天前
|
NoSQL Go Redis
Go语言中如何扫描Redis中大量的key
在Redis中,遍历大量键时直接使用`KEYS`命令会导致性能瓶颈,因为它会一次性返回所有匹配的键,可能阻塞Redis并影响服务稳定性。为解决此问题,Redis提供了`SCAN`命令来分批迭代键,避免一次性加载过多数据。本文通过两个Go语言示例演示如何使用`SCAN`命令:第一个示例展示了基本的手动迭代方式;第二个示例则利用`Iterator`简化迭代过程。这两种方法均有效地避免了`KEYS`命令的性能问题,并提高了遍历Redis键的效率。
11 0
|
4天前
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
|
5天前
|
关系型数据库 MySQL 数据库连接
Go语言中使用sqlx来操作事务
在应用中,数据库事务保证操作的ACID特性至关重要。`github.com/jmoiron/sqlx`简化了数据库操作。首先安装SQLX和MySQL驱动:`go get github.com/jmoiron/sqlx`和`go get github.com/go-sql-driver/mysql`。导入所需的包后,创建数据库连接并使用`Beginx()`方法开始事务。通过`tx.Commit()`提交或`tx.Rollback()`回滚事务以确保数据一致性和完整性。
8 0