Python核心编程(第3版)
第1 部分 通用应用主题

第8章 扩展Python

章节主张:扩展 Python 章是在建立一个成熟判断:什么时候 Python 作为协调层已经足够,什么时候才有必要下沉到 C 扩展。

中文释读:真正的工程能力不是盲目追性能,而是在开发效率、可维护性、性能收益和生态兼容之间做明智取舍。

章节知识路线

  1. 8.1 简介和动机
  2. 8.2 编写Python扩展
  3. 8.3 相关主题
  4. 8.4 练习

关键论点

  • 扩展写法只是手段,边界判断才是核心。
  • 引用计数、线程与导入测试说明底层成本不低。
  • SWIG、Cython、PyPy 等选项体现了不同折中方案。

行动清单

  • 先做 profile。
  • 给扩展层设计稳定接口。
  • 优化后回归测试功能一致性。

源章节深读

8.1 简介和动机

解决的问题:这一节解决的是“8.1 简介和动机在真实应用里到底扮演什么角色”。

第 8 章 扩展 Python 287 本章将介绍如何编写扩展代码,并将其功能集成到 Python 编程环境中。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 8.1 简介和动机 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

第 8 章 扩展 Python 287 本章将介绍如何编写扩展代码,并将其功能集成到 Python 编程环境中。 首先介绍这样做的 动机,接着逐步介绍如何编写扩展。 需要指出的是,虽然 Python 扩展主要用 C 语言编写,且出 于通用性的考虑,本节的所有示例代码都是纯 C 语言代码。

8.2 编写Python扩展

解决的问题:这一节解决的是“8.2 编写Python扩展在真实应用里到底扮演什么角色”。

第 8 章 扩展 Python 289 8.2 编写 Python 扩展 为 Python 编写扩展主要涉及三个步骤。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 8.2 编写Python扩展 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

第 8 章 扩展 Python 289 8.2 编写 Python 扩展 为 Python 编写扩展主要涉及三个步骤。 8.2.1 创建应用代码 首先,所有需要成为扩展的代码应该组成一个独立的“库” 。 换句话说,要明白这些代码 将作为一个 Python 模块存在。

8.3 相关主题

解决的问题:这一节解决的是“8.3 相关主题在真实应用里到底扮演什么角色”。

302 第 1 部分 通用应用主题 与引用计数宏相同,这里也建议读者阅读 Python 文档中关于扩展和嵌入 Python 的内容, 以及 Python/C API 参考手册。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 8.3 相关主题 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

302 第 1 部分 通用应用主题 与引用计数宏相同,这里也建议读者阅读 Python 文档中关于扩展和嵌入 Python 的内容, 以及 Python/C API 参考手册。 8.3 相关主题 本章最后一节将介绍其他用来编写扩展的工具,如 SWIG、 Pyrex、 Cython、 psyco 和 PyPy。 最后简要讨论一个相关主题,即嵌入 Python,以此来结束本章。

8.4 练习

解决的问题:这一节解决的是“8.4 练习在真实应用里到底扮演什么角色”。

304 第 1 部分 通用应用主题 http://en.wikipedia.org/wiki/PyPy 8.3.6 嵌入 Python 嵌入是 Python 的另一项特性。

怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。

提醒:最常见的问题是只记住 8.4 练习 的 API 或步骤,却没搞清它的上下游依赖与边界条件。

原文线索

304 第 1 部分 通用应用主题 http://en.wikipedia.org/wiki/PyPy 8.3.6 嵌入 Python 嵌入是 Python 的另一项特性。 其与扩展相反,不是将 C 代码封装进 Python 中,而是在 C 应用中封装 Python 解释器。 这样可以为一个庞大、单一、要求严格、专有,并(或)针对 关键任务的应用利用 Python 解释器的强大功能。

辨别题

为什么过早写扩展常常得不偿失?

本章图版学习路径

8.1 简介和动机

扩展编写流程