Python猫荐书系统之四:《Python源码剖析》

AlgoCipherMaster
• 阅读 8569

Python猫荐书系统之四:《Python源码剖析》

大家好,新一期的荐书栏目如期跟大家见面了。

先来看看今天的主角是谁:《Python源码剖析——深度探索动态语言核心技术》,2008年出版,作者 @陈儒 ,评分8.7分。

Python猫荐书系统之四:《Python源码剖析》

是的,你没看错,出版年份2008年。这本书基于Python2.5,到了十年后3.7版本的年代,可以说大部分内容已经过时了,而且,还可能缺失了很多关键内容。那你也许会问,一本过时的书,有啥好推荐的呢?下面且听我给你慢慢道来。

一个巧合,一份期待

在写第一篇荐书《编写高质量代码改善 Python 程序的 91 个建议》的时候,我偶然发现知乎上有人提及,说 @赖勇浩 大大正在接手这本源码剖析的新版本编写,很多人留言说期待。我想起曾经看到,有人推荐过这本书,于是便去查了一下。

书的内容简介中有这一段,我看了便觉得兴趣满满:

本书以CPython为研究对象,在C代码一级,深入细致地剖析了Python的实现。书中不仅包括了对大量Python内置对象的剖析,更将大量的篇幅用于对Python虚拟机及Python高级特性的剖析。通过此书,读者能够透彻地理解Python中的一般表达式、控制结构、异常机制、类机制、多线程机制、模块的动态加载机制、内存管理机制等核心技术的运行原理,同时,本书所揭示的动态语言的核心技术对于理解其他动态语言,如 Javascript、Ruby等也有较大的参考价值。

作为一个半路上车,刚走出新手村的Pythoner,我正愁如何才能成为一个优秀的Pythonista,这本书闪耀着绝世秘籍的光芒,我起初有点望而却步,过后却又跃跃欲试。

那么,新书啥时候上市呢?在华蟒用户组 里,正好有人问到这个消息,群众们纷纷表示翘首以待。不过,赖勇浩站出来回复了:

Python猫荐书系统之四:《Python源码剖析》

看回复的时间,这事已经过去一年了......

虽然这个神秘的新作者拖稿了,但书的期待值并未因此减损,相反,这恰恰意味着新书上市之日更近了!说不定就在明年上半年了呢。赶在新书出版前,我们荐书栏目先来安利一波,这绝对是一件有先见之明的事,喵喵,美滋滋~~~

一份提纲,一些建议

铺垫了这么多,接下来要好好说下这本书的内容了。以下内容仅针对08版书籍,等新版上市后,荐书栏目会对两版的差异跟进介绍。

全书主要分两部分,第一部分(1-6章)剖析Python的几大内建对象(如整数、字符串、列表、字典),涉及对象创建、维护、缓冲池、提升效率的机制等内容;第二部分(7-16章)剖析Python虚拟机,涉及虚拟机框架、一般表达式、控制流、函数机制、类机制、运行环境初始化、动态加载机制、多线程机制、内存管理机制等内容。

有道是,Python中万物皆对象。而Python是用C语言实现的,C语言却是典型的面向过程语言 ,那么,它是如何实现”万物皆对象“的呢?实际上,Python对象是C的结构体在堆上申请的一块内存(包括连续内存与非连续内存),所有内建的类型对象都是被静态初始化了的。

按照书中的分类,Python对象可分如下:

Python猫荐书系统之四:《Python源码剖析》

其中,Fundamental对象是指类型对象,Numeric对象是指数值对象,Sequence对象是指容纳其它对象的序列集合对象,Mapping对象是类似于C++中map的关联对象,Internal对象是Python虚拟机在运行时内部使用的对象。

还有一种分类方式,Python对象可以分为定长对象 与变长对象。从这些分类中可以看出,Python对象之间存在着天然差异,那么,不同对象的生命周期管理(创建、维护、使用、回收)、对象的多态、对象缓冲池、以及其它特有的机制,这些都是怎么实现的呢?

书中第一部分内容就是对以上问题的回答。阅读过程中,我读到了一些熟悉的内容,例如之前在《Python中的“特权种族”是什么?》中发明的“特权种族”(例如神秘的[-5,256]数字、以及Intern机制的短字符串),它们在内建对象剖析的部分里都有。阅读的过程,就是从知其然,到知其所以然的过程,于我大有益处。

说实话,源码分析的部分,对我来说太难了,因为C语言基础早已交还给大学老师了......但是,阅读第一部分的好处是,你不必完全懂源码,因为作者加了很多注释,相关的分析过程也很详尽。

至于书中的第二部分,我还不敢进入。这部分需要一些编译原理知识、字节码及虚拟机知识。留待今后继续学习。

全书章节的编排结构特别清晰,已经提供了一份很好的学习路径提纲。这里,我还搜集了一些阅读建议,下面看看有什么:

如果你在用一门高级语言,想了解语言的实现原理,这本书是你的必选;如果你是一个 C/C++ 程序员,想写出高质量的程序,这本书也是你必选。—— @simonliu

需要说明的是,我不会向python语言的学习者推荐这本书,因为它不是一本python语言的教材。相反,作为分析Python运行时机制的专著,书中充斥着有关C、C++的讨论(我还读到了有用java做为比较的段落)。这不要求读者是专业的C/C++程序员,但是至少应该能够读懂C代码,最好知道 C++ STL是怎么回事。......我坚信,这本优秀的著作,值得译为英文,向全世界的C/C++/Python程序员推荐。——@膘

很好的讲解Python源码剖析的书籍,深入讲解了Python的各种特性是如何通过C语言实现的,对于想了解Python底层实现的程序员很有帮助,讲解的很详细,不过看底层C实现看多了也确实容易乏味、消磨耐性,尤其后面高级特性的剖析时,看起来愈发吃力、费劲。 目前先通读了一遍,帮助自己了解了Python的不少特性和其底层机制,还有很多地方草草略过并不十分明白,日后实力更上一层楼时,再回来拜读。 好书推荐!——@流星云

源码可以不读,这本书还是值得读的。——@赖勇浩

常备的手边书,深入了解Python的好书。——@清风

一份资源,更多福利

相信能够读到这里的读者,都燃起了一些阅读兴趣,可以“按图索骥”去学习。电子学习资源很多,对于爱学习 的你们来说,这不是啥难事。豆瓣读书、当当网和京东图书上,也有电子书可购买。

但是,如果你想买纸质书,不好意思,早就绝版了。二手旧书的价格贵得吓人,下面讯息给不差钱的同学们参考下:

Python猫荐书系统之四:《Python源码剖析》

在中英文的Python书籍中,这本剖析源码的书籍,可能是绝无仅有的一本,就凭这点,怎么推荐都不为过。对于可能会很快上市的新书,则是怎么期待都不为过的。如果有小伙伴知道出版消息,恳请在后台告知于我,不胜感激。

在荐书《黑客与画家》的时候,我们送出了一本精装书福利。等到这本源码剖析的新书上市时,送书福利肯定会是大大的,大家拭目以待吧。当然,后续其它荐书的书目,也很有可能会送福利,一样不容错过。所以,我要打个小广告,还没关注的小伙伴,赶紧扫描下方二维码,立刻关注公众号Python猫 ,关注我们的荐书栏目,让我们一同学习,一同进步,一同抢福利,喵喵喵~~~


本文原创并首发于微信公众号【Python猫】,后台回复“爱学习”,免费获得20+本精选电子书。

往期荐书回顾:
第一期:《编写高质量代码改善 Python 程序的 91 个建议
第二期:《Python最佳实践指南
第三期:《黑客与画家

延伸阅读:
陈儒博客:https://blog.csdn.net/balabal...
豆瓣书目:https://book.douban.com/subje...
Python源码:https://svn.python.org/projects/
书评笔记:
https://book.douban.com/revie...
https://blog.csdn.net/lxlmycs...

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这