Python轻松,Go简单...不过'简单'可并不代表'轻松'哦!

超级欧派课程 2024-03-07 03:35:21

Python 和 Go 这两帮孩子,每个都有点不容忽视的魔力。

大家都以为‘简单’和‘轻松’是一对好朋友,咱们试试把锅子放到火上,拉开盖子看看是不是真如你所愿。「轻松」那小子看似毫不费力,可其中套路可不少哦!

Python这小子大家都认识,易学易懂,深得新手们的喜爱,这就是他的魔力所在。他去过全球各地的学校、大学、研究中心,那些大大小小的公司都曾聘请他,原因就在于他能给每个人,不论学历、背景,甚至是没有任何编程基础的人都带来编程的便利。你不需要知道太多的编程理论,你只需要关心显示器上展示出的结果。并且,Python还是科学和系统级库的“大门”。你只需要一行代码,就能使你感觉到在你手掌之间,似乎触手可及的力量,在颤动。这可是他成为地球上最受欢迎的编程语言之一的原因。

然而,事情永远都不会那么一帆风顺。Python简洁易懂的外表下,骨子里却是一堆复杂的东西。对了,你可能听说过,Python 是一种“慢”语言,原因何在?大部分是因为解释器在运行时需要做出大量的决策。我觉得这还不是最大的问题。Python运行时生态系统的复杂性,以及在包管理中过于自由的设计决策,往往导致环境极易受损,并且更新往往引发不兼容性和运行时崩溃。离开项目几个月后回头一看,结果发现他变得糟透了,甚至无法运行了。这可就有些头大了吧。

我知道,你一定知道Docker这个牛刀小试的存在,用来解决这一类的问题。这就像是人们寻找的光明就在那个出口前面,感谢Docker,我们可以将Python代码库的依赖“冻结”,让它永远运行。当然了,这是要付出代价的。它的复杂性和责任都转移到了操作系统的基础设施上。虽然它并非无法解决,但每当翻山越岭后都还得面对沼泽,这也是挺令人头疼的。

从"游刃有余"到"灵活应对"

如果我们要解决Python的问题,我们会得到一摞破烂,有点像Rust - 功能强大但非常难驾驭。Rust 在我看来就像人们口中的大老虎,初学者劝你远而避之。它虽然在这些天如日中天,但是有20年编程经验的我,对于C和C++代码我可“再也不惧”,看Rust代码却感到一脸懵逼。

我在五年前第一次挑战Go的时候,我正在开发一个以Python为基础的系统。尽管我开始对它的语法并不极力看好,我立刻就意识到了它背后所隐藏的简单之道。Go的目的就是让每个人都能理解它,从刚出校门的初级开发者到高级工程部门经理人。为编程领域做出贡献的语言只有它,Go几乎没有通过更新语法来改变自己的主张。最后一次重大更新是在v1.18中添加的泛型,这只是在讨论了10多年后才添加上去的。大多数时候,不管你看的是五天前写的还是五年前写的Go代码,它们总是一样的,而且应该能很好地工作。

然而,简单性是要有纪律的。一开始,它可能会让你觉得有些束手束脚。特别是与Python的有趣创新相比,例如列表解析或字典解析:

在Go中,虽然相同的代码可能需要敲几次键,但它应该比Python解释器在底层做的事情更容易理解:

虽然你可以在Python中编写等效的代码,但在编程中有一条不成文的规则:如果语言提供了一种更简易(即更简洁、更优雅)的选择,程序员倾向于使用它。一种事物如果“简单”是因人而异的,然而“简洁”是一定适用于每一个人的。对于同一行为的替代方式的可用性导致了不同的编程风格,在同一代码库中,你可能会发现多种风格交织。

因为Go引人入胜而且“单调乏味”,它却符合另一个标准。在编译一个可执行文件时,Go编译器需要做的工作要少得多。编译和运行Go应用程序通常和Python解释器或Java虚拟机开始加载,并甚至在运行实际应用程序之前,快得多。这并不让人惊讶,一个原生的可执行文件,获得的速度就是一个可执行文件可以达到的最快速度。虽然它不像C/C++或Rust那样快,但复杂度却只有一小部分。我愿意忽略这个Go的“损失”。 Go的二进制文件是静态绑定的,这意味着你在任何地方都可以创建一个并在目标主机上运行它,而完全不需要任何运行时或库依赖,甚至连个“打招呼”的时间都省了。

我们如何利用Python和Go的优点

在我们的工作中,我们找到了最实用的解决方案是结合Python的“随和”和Go的“简单”。对我们来说,Python就像是我们每个项目的游乐场。它是思想诞生的地方,科研假说被接受或拒绝的地方。Python是数据科学和机器学习的天然选择,我们处理的大多数问题都需要Python,所以尝试用其他方式来取代它简直就是瞎子点灯——多此一举。Python也是其他工具的核心,比如Django,你知道,它能允许快速开发应用程序,就像其他几个工具一样(当然,Ruby on Rails和Elixir的Phoenix在这里非常值得一提)。

假设一个项目需要少量的用户管理和内部数据管理(像我们的大多数项目那样)。这时,我们将给它一个 Django脚手架,原因在于其内置的 Admin 那么好,一旦粗糙的Django原型项目开始变得像个产品,我们就会确定多少可以用Go重写。由于Django应用已经定义了数据库和数据模型的结构,所以开始编写Go代码就变得容易了。几次迭代后,我们达到一个共生状态,两边都在同一个数据库上,只用简单的消息来通信。最终,Django的“壳”成为了协调员,为管理员提供服务,触发由Go处理的任务。而Go部分为所有其他事务提供服务,如面向前端的API和端点,业务逻辑和后端的工作处理。

到目前为止,这种共生已经工作得很好,我希望未来也能保持这种状态。在未来的帖子中,我将详细描述架构本身。

感谢阅读!

《改善python代码质量的使用技巧》专栏是我最近在写的一本针对Python开发人员的实用编程指南,涵盖了Python中最强大和有用的特性和技巧。从基础知识入手,深入介绍函数式编程、面向对象编程、并发编程、网络编程、Web开发、数据处理和机器学习等内容。透彻解析Python语言特性,提供实践案例和示例代码,帮助您优雅解决各种问题。

如果您对python asyncio异步编程模型感兴趣,可以关注我的《python asyncio从入门到精通》专栏。

0 阅读:0

超级欧派课程

简介:感谢大家的关注