image.png

没有引发任何行动的思想都不是思想,而是梦想。 —— 马丁

1. 为什么要钻研 Python 源码

你好,我是悦创。经过多年的摸爬滚打,我对 Python 开发有一些自己的体会,深知源码研究的意义。

此外,我从 2018 年便开始参与技术人才的招聘工作,经常在面试中考察候选人对 Python 内部原理的理解,发现源码是区分度较大的话题之一。我见过不少候选人底层功底薄弱,知其然而不知其所以然,因而与工作机会无缘,非常可惜。

随着人工智能等技术的兴起,Python 正风靡世界!最新的 TIOBE 编程语言排行榜上,Python 已经稳居前3 位!正如硬币的两面,这对 Python 工程师来说既意味着机遇,也带来一些挑战
image.png
一方面,采用 Python 技术栈的公司越来越多,掌握 Python 的工程师不愁没有工作机会。

另一方面,大量的工程师浩浩荡荡加入 Python 大军,竞争日益激烈。如果你想要从众人中脱颖而出,就必须拿出自己的看家本领。

不少初学者觉得,能用 Python 完成开发需求就行了,没必要深入学习。这个观点是非常错误的,掌握语法只是万里长征第一步。

程序能跑起来,并不意味着程序能高效地运行,实际上这两者有天壤之别。制约程序效率的因素很多,语言特性、运行机制、算法原理、操作系统环境等等,只掌握皮毛显然无法驾驭这些。

我见过不少初级工程师,开发出来的程序逻辑上没有问题,但是性能低下。程序上线就承受巨大压力,甚至引发性能故障,严重影响个人业绩。

归根到底,还是在底层原理上吃亏。不管学习什么技术,浅尝辄止肯定是不行的。因此,要么满足于Python 语法,沦为 API 调用侠;要么,彻底掌握 Python 的内部原理。

研究过源码的我,深知这其中的艰辛——成千上万行代码,多少个日日夜夜以及笔记本里的一个个草图……如果能够将心得分享出来,相信对后来者会有所帮助。因此,出现了这个系列文章。

那么,这个专栏都介绍些什么内容呢?

第一部分,开篇。讨论源码学习对提升开发能力的重要意义,结合“小菜”的经历介绍 Python 工程师的成长历程。

第二部分,对象模型。介绍 Python 面向对象理论体系,明确“”和“对象”在 Python 中的表现形式。通过源码,分析对象的内存布局,研究对象的生命周期,初步揭开对象的面纱。

第三部分,内建对象。涵盖 float、int、bytes、str、list、dict 等内建对象的实现细节,重点突出每种对象的数据结构以及背后的算法思想,并结合工程实践讲解内建对象的妙用

第四部分,虚拟机。先介绍 Python 程序的执行过程以及字节码的结构;然后介绍 Python 虚拟机的运行机制,以及名字空间等运行时上下文;最后讲解 GIL全局锁对虚拟机的影响并探索应对之策。

第五部分,函数机制。探索函数从代码转化成函数对象的所有步骤,并以 Python 代码模仿这个过程。重点讲解嵌套函数闭包以及装饰器这些面试必问概念,并结合工程实践介绍函数式编程装饰器的高级用法。

第六部分,类机制。探索类从代码转化为对象进而创建实例对象的所有步骤,并以 Python 代码进行模拟。重点讲解继承机制属性查找等高频面试知识点,以及魔术方法元类在程序开发中的妙用。

第七部分,生成器与协程。讨论生成器的高级用法,并以字节码讲解它的运行原理。基于生成器,动手设计一个协程库,加深对协程运行机制的理解。结合工程实践,讲解用 asyncio 构建高并发应用的技巧。

第八部分,内存管理机制。结合 Python 特色全面讲解内存池、引用计数、标记删除、分代回收等关键技术。理论联系实际,以一个真实案例介绍工程实践中排查并解决内存泄露问题的方法论。

第九部分,总结。回顾专栏内容,在读懂 Python 基础上,追求有 Python 格调的代码设计技巧。

那么,学习本专栏学要具备哪些基础知识呢?

基本的 Python 开发能力是必须的,不需要特别深入,能独立编写程序即可。有一定的 C 语言基础更好,没有也不打紧。专栏从最简单的源码入手,逐步深入,并在必要地方补充介绍相关 C 语言知识。大家不必恐惧 C 语言,专栏精心编排,并不拘泥于繁缛的代码细节,总体通俗易懂。

此外,专栏附带大量的图表,详尽地描绘了 Python 内部各种数据结构间的关系。例如,list 对象的内部结构图:
image.png
相信在这些图表的帮助下,你可以轻松地理解原本很深奥的源码。虽然绘制这些图表花了我大量的时间,但这一切都是值得的。希望我一个人的时间付出,能帮更多的人节约学习时间,起到事半功倍的效果。诚如是,则不胜荣幸!

著名技术作家侯捷在《STL源码剖析》中说过:源码之前,了无秘密。源码就像武功秘籍,虽然有时难懂如天书;可一旦参透,便掌握绝世武功的奥妙!感恩学生时代花了无数日夜苦读《STL源码剖析》的自己!

源码之前,了无秘密!与诸君共勉!