前  言

本书面向有志于拓展及深化Python知识的读者,它将教你如何改进Python程序的质量、可靠性、速度、可维护性以及可用性。书中包含大量实用的范例与思路,可帮助大家提升Python编程水平。
本书有四大主题:用设计模式编写出优雅的代码、用并发和“编译过的Python”(也就是Cython)提升处理速度、高级网络编程,以及图形。
《Design Patterns: Elements of Reusable Object-Oriented Software》(详情参见附录B)一书虽然早在1995年就出版了,然而时至今日,依然深刻地影响着面向对象编程这一领域。本书从Python语言的角度重新审视前书所提到的每种设计模式,给出实用的Python范例,并解释为何Python程序员用不到某些模式。这些模式在第1章、第2章及第3章中讲解。
Python的GIL(Global Interpreter Lock,全局解释器锁)会阻止Python代码同时在多个处理器核心上运行。于是有人就误以为Python不支持多线程,或无法发挥多核硬件的优势。对于“计算密集型”(CPU-bound)程序来说,可以用multiprocessing模块实现并发,该模块不受GIL限制,可以完全利用每个核心。这样一来,处理速度就很容易提高了(大致同CPU的核心数成正比)。对于“I/O密集型”程序来说,我们既可以用multiprocessing模块来做,也可以用threading模块或concurrent.futures模块来做。实际上,使用threading模块来编写I/O密集型程序时,并不用担心由GIL所带来的开销,因为网络延迟的影响更大。
遗憾的是,在编写并发程序时,如果采用低级与中级方式,那么非常容易出错,任何编程语言都有这种问题。要想少出错,就不要使用“显式锁”(explicit lock),而是改用Python的queue及multiprocessing模块,这些模块提供了封装程度较高的“队列”(queue),此外,也可以改用concurrent.futures模块来做。第4章会告诉大家如何用封装程度较高的并发技术来大幅提高程序性能。
某些程序员之所以使用C、C++或其他“编译型语言”(compiled language)来编程,是因为他们还有另外一个错误的想法,那就是Python程序运行得很慢。一般来说,Python确实要比编译型语言慢,但在目前的硬件上面,用Python语言所编写的绝大部分应用程序的运行速度都足够快。即便有时Python程序真的不够快,我们也可以一边享受用Python编程所带来的好处,一边想办法提升其运行速度。
如果要给某些长期运行的程序提速,那么可以使用PyPy这款Python解释器(网址是pypy.org)。这是一种“即时编译器”(just-in-time compiler),可以极大提升程序执行速度。另外一种优化执行效率的方式是调用运行速度与编译后的C程序相仿的代码,对于“计算密集型”程序来说,用这种代码改写后,其执行速度很容易变成原来的100倍。要想使Python程序运行得和C程序一样快,最简单的办法就是调用那种底层以C语言来实现的Python模块。比方说,标准库里的array模块或第三方numpy模块都能飞快地处理数组,并且很省内存(多维数组可以用numpy来处理)。除此之外,还可以使用标准库的cProfile模块来探查程序的瓶颈,并用Cython来写对速度要求很高的那部分代码。这种写法实际上就是一套“增强版Python语言”(enhanced Python):写好的程序可以编译成纯C,从而使运行速度提升到极致。
当然,有时候我们所需的功能已经由现成的C或C++库实现好了,或者由采用“C语言调用约定”(C calling convention)的其他语言程序库实现好了。在大多数情况下,都能找到第三方Python模块来访问我们所需的那些程序库,这些模块可以在Python Package Index(简称PyPI,网址是pypi.python.org)里找到。不过在个别情况下可能找不到这种模块,此时可以用标准库的ctypes模块或第三方的Cython包来调用C程序库里的功能。采用已经实现好的C程序库来编写代码能够极大减少开发时间,而且C代码的运行速度也相当快。第5章讲解ctypes与Cython。
Python标准库提供了许多用于网络编程的模块,比如底层的socket模块、中层的socketserver模块,以及高层的xmlrpclib模块。把用其他语言所写的代码移植到Python时,可能会用到底层与中层网络模块,然而直接用Python编程时,通常不需要理会那些底层的细节,只需要用高层模块来实现所需的网络功能即可。第6章讲解如何使用标准库中的xmlrpclib模块以及功能强大且易用的第三方RPyC模块。
每个程序差不多都要提供某种用户界面,使用户可通过它来向程序下达指令。可以用argparse模块来编写Python程序,使其支持命令行界面;也可以用其他模块来编写,使其支持完整的终端用户界面(例如,在Unix系统上,可用第三方urwid包实现这种界面,此包的网址为excess.org/urwid)。此外,有许多Web框架能够实现出Web界面,比如轻量级的bottle框架(网址是bottlepy.org)、重量级的Django框架(网址是www.djangoproject.com)与Pyramid框架(网址是www.pylonsproject.org)。当然,除了上面说的这几种界面外,还可以创建具有“图形用户界面”(Graphical User Interface,GUI)的Python应用程序。
经常听到“Web程序将取代GUI程序”这种说法,不过现在还没发展到那一步。实际上,用户可能更喜欢GUI程序,而不是Web程序。比方说,在21世纪初智能手机刚开始流行时,用户总是爱用专门制作好的“app”而不是浏览器中的网页来处理日常事务。有许多第三方Python包都可用来编写GUI程序。本书第7章要介绍的Tkinter包位于Python标准库里,该章会告诉大家如何用它创建样式新潮的GUI程序。
目前大多数计算机(包括笔记本电脑及部分智能手机)都配有功能强大的图形渲染硬件,这种硬件通常是独立的GPU(Graphics Processing Unit,图形处理单元),能够绘制出绚丽的二维及三维图形。而大多数GPU都支持OpenGL API,所以Python程序员可以通过第三方包来调用这套API。第8章将会讲解怎样用OpenGL绘制三维图形。
本书旨在演示如何编写更好的Python程序,如何写出效率高、易维护且易于使用的Python代码。阅读之前,需要有Python编程基础,因为此书是写给已经学会Python语言用法的读者看的,大家应该已经读过Python的开发文档或是类似教程了,比如《Programming in Python 3, Second Edition》(详情参见附录B)等书。而这本书将提供一些有助于提升Python编程水平的思路、灵感与实用技巧。
本书全部范例代码都在Linux系统的Python 3.3版本下测试通过(笔者也尽量在Python 3.2及Python 3.1版本下测试过了),绝大部分代码还能在OS X与Windows操作系统中运行。可从本书网站www.qtrac.eu/pipbook.html下载范例代码,这些代码也应该能在后续的Python 3.x版本下运行。
致谢
与写其他技术书籍时一样,笔者写这本书时也得到了大家的诸多建议、帮助及鼓励,在此深表谢意。
Nick Coghlan从2005年起成为Python的核心开发者,他提供了大量建设性的批评意见,并展示了许多想法及代码片段,以此表明书中所讲的某些内容还有更好的实现方式。Nick对笔者改进本书内容帮助极大,尤其是前面几章。
Doug Hellmann是资深Python开发者与技术作者,他给笔者写了许多条非常有用的评论,从成书之前的出版提案到成书之后正文里的每一章都是如此。Doug还给笔者提供了许多思路,并为本书撰写了序。
两位友人Jasmin Blanchette与Trenton Schulz都是有经验的Python程序员,他们各自的研究方向迥然不同,但都位于本书所讲的范围之内。Jasmin与Trenton反馈了许多意见,使笔者能够据此改写正文及范例代码中的许多不够明晰之处。
感谢策划编辑Debra Williams Cauley,在成书过程中,他再次向我提供了支持和帮助。
感谢Elizabeth Ryan精心管理了本书的出版流程,感谢Anna V. Popick出色的校对工作。
最后,一如往常,感谢妻子Andrea的关爱与支持。

目  录

第1章 Python的创建型设计模式
1.1 抽象工厂模式
1.1.1 经典的抽象工厂模式
1.1.2 Python风格的抽象工厂模式
1.2 建造者模式
1.3 工厂方法模式
1.4 原型模式
1.5 单例模式

第2章 Python的结构型设计模式
2.1 适配器模式
2.2 桥接模式
2.3 组合模式
2.3.1 常规的“组合体/非组合体”式层级
2.3.2 只用一个类来表示组合体与非组合体
2.4 修饰器模式
2.4.1 函数修饰器与方法修饰器
2.4.2 类修饰器
2.5 外观模式
2.6 享元模式
2.7 代理模式

第3章 Python的行为型设计模式
3.1 责任链模式
3.1.1 用常规方式实现责任链
3.1.2 基于协程的责任链
3.2 命令模式
3.3 解释器模式
3.3.1 用eval()函数求表达式的值
3.3.2 用exec()函数执行代码
3.3.3 用子进程执行代码
3.4 迭代器模式
3.4.1 通过序列协议实现迭代器
3.4.2 通过双参数iter()函数实现迭代器
3.4.3 通过迭代器协议实现迭代器
3.5 中介者模式
3.5.1 用常规方式实现中介者
3.5.2 基于协程的中介者
3.6 备忘录模式
3.7 观察者模式
3.8 状态模式
3.8.1 用同一套方法来处理不同的状态
3.8.2 用不同的方法来处理不同的状态
3.9 策略模式
3.10 模板方法模式
3.11 访问者模式
3.12 案例研究:图像处理程序包
3.12.1 通用的图像处理模块
3.12.2 Xpm模块概述
3.12.3 PNG包装器模块

《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 导读相关推荐

  1. 《应用时间序列分析:R软件陪同》——1.5 习题

    本节书摘来自华章计算机<应用时间序列分析:R软件陪同>一书中的第1章,第1.5节,作者:吴喜之,刘苗著, 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.5 ...

  2. 《应用时间序列分析:R软件陪同》——2.3 随机游走

    本节书摘来自华章计算机<应用时间序列分析:R软件陪同>一书中的第2章,第2.3节,作者:吴喜之,刘苗著, 更多章节内容可以访问云栖社区"华章计算机"公众号查看.

  3. 《应用时间序列分析:R软件陪同》——导读

    ** 前言 ** 首先,一些教材偏重于数学理论和推导.作者多为数学出身,他们习惯于数学的严格性和导出精确而又漂亮的数学结论.这些书适用于那些愿意为时间序列的数学理论研究做出贡献的读者. 其次,国内教材 ...

  4. arima模型_时间序列分析(R)‖ARIMA模型预测实例

    背景 十九大报告,对教育方面做出了详细说明.近年来,随着研究生招生规模的逐渐扩大,报名参加硕士研究生考试的人数也逐年增加.大多数关于研究生的文章是以研究生的现状.研究生的教育.研究生的就业等方面为主题 ...

  5. R语言入门(1)时间序列分析

    时间序列分析 使用软件为Rstudio,参考CRAN中时间序列分析分析函数和package,拿手上的数据练习一下时间序列分析. 1.原始数据说明 选择连续9天的数据,共2025条,时间间隔为5分钟.具 ...

  6. r软件时间序列分析论文_高度比较的时间序列分析-一篇论文评论

    r软件时间序列分析论文 数据科学 , 机器学习 (Data Science, Machine Learning) In machine learning with time series, using ...

  7. 时间序列分析及应用r语言pdf_R语言:时间序列经典分析法(二)

    题记:本文是个人的读书笔记,仅用于学习交流使用.本文将深入研究时间序列技术. 01 解决什么问题? 前面一章,介绍了时间序列中涉及到的基本概念,本章将在此基础上介绍如何对时间序列的资料进行分析,怎么选 ...

  8. 使用R语言对股票数据进行时间序列分析

    tushareID:469251 R语言相对于python在做统计分析是十分方便的软件,时间序列分析在数理统计理论方面很有支撑,解释性也很强,理论已经很成熟,不了解的小伙伴可以去搜下相关课程. 这里记 ...

  9. R语言mgcv包时间序列分析在空气污染与健康领域的应用(3)---模型自由度选择

    广 义 相 加 模 型 ( generalized additional model,GAM)是对传统广义线性模型的非参数拓展,可有效处理解释变量与效应变量间复杂的非线性关系.GAM 目前已广泛应用于 ...

  10. R语言mgcv包时间序列分析在空气污染与健康领域的应用(1)

    在空气污染与健康研究领域,经常需要用时间序列方法将随时间变化的污染物暴露资料和随时间变化的事件发生数资料联系起来,分析人群健康结局与暴露水平之间的关系. 时间序列分析是根据系统观测得到的时间序列数据, ...

最新文章

  1. 洪水填充算法_基于GIS的洪水淹没范围计算
  2. java8 注解增强_Java8新增的重复注解功能示例
  3. 【Linux】一步一步学Linux——declare命令(217)
  4. 怎么用计算机截图快捷键,电脑怎么截图截屏 电脑截图的快捷键是什么
  5. Python面向切面编程是什么
  6. java 双等号(==) 与equals方法的使用区别
  7. 极大似然估计的渐进正态性
  8. guava-Retryer失败重试
  9. 这是我见过最好的唐诗,而且通俗易懂
  10. 采样定理与奈奎斯特极限
  11. 等级测评——定级、等级划分及测评时间
  12. Java动态代理原理分析
  13. #内存泄露# #valgrind# valgrind简介
  14. 从整体视角了解情感分析、文本分类!
  15. echarts折线图实现滑动平移,横坐标过多时隐藏部分横坐标,通过滑动平移显示隐藏的部分
  16. 生成模型和判别模型的对比,懂这俩机器学习不在话下 最大熵模型
  17. 如何获取机器人方向新信息资讯-2023
  18. Linux make学习
  19. 页面置灰filter: grayscale(1)
  20. flex垂直居中,最简单的方法之一

热门文章

  1. c# 遍历文件夹深度_C#.NET中遍历指定目录下的文件(及所有子目录及子目录里更深层目录里的文件)...
  2. sqlserver text最大长度_1156. 单字符重复子串的最大长度
  3. android web canvas,HTML5 - Canvas无法在Android WebView的第一次加载时渲染
  4. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用
  5. python中try怎么用_python下try
  6. php 怎么复制一个文件,php如何复制文件夹?
  7. es6html模板,js 字符串模板 ES6
  8. psychopy 音频时长代码_多媒体之音频输入1
  9. java break(),Java BreakIterator last()用法及代码示例
  10. html js 读取资源文件,使用HTML5和JQuery读取CSV(Text)文件的实例