第1章 理解高性能Python 1
1.1基本的计算机系统 1
1.1.1计算单元 2
1.1.2存储单元 5
1.1.3通信层 6
1.2将基本的元素组装到一起 8
1.3为什么使用Python 12
第2章 通过性能分析找到瓶颈 15
2.1高效地分析性能 16
2.2 Julia集合的介绍 17
2.3计算完整的Julia集合 20
2.4计时的简单方法——打印和修饰 24
2.5用UNIX的time命令进行简单的计时 27
2.6使用cProfiile模块 28
2.7用runsnakerun对cProfiile的输出进行可视化 33
2.8用line_profiiler进行逐行分析 34
2.9用memory_profiler诊断内存的用量 39
2.10用heapy调查堆上的对象 45
2.11用dowser实时画出变量的实例 47
2.12用dis模块检查CPython字节码 49
2.13在优化期间进行单元测试保持代码的正确性 53
2.14确保性能分析成功的策略 56
2.15 小结 57
第3章 列表和元组 58
3.1一个更有效的搜索 61
3.2列表和元组 63
3.2.1动态数组:列表 64
3.2.2静态数组:元组 67
3.3小结 68
第4章 字典和集合 69
4.1字典和集合如何工作 72
4.1.1插入和获取 73
4.1.2删除 76
4.1.3改变大小 76
4.1.4散列函数和熵 76
4.2字典和命名空间 80
4.3小结 83
第5章 迭代器和生成器 84
5.1无穷数列的迭代器 87
5.2生成器的延迟估值 89
5.3小结 93
第6章 矩阵和矢量计算 94
6.1问题介绍 95
6.2 Python列表还不够吗 99
6.3内存碎片 103
6.3.1理解perf 105
6.3.2根据perf输出做出抉择 106
6.3.3使用numpy 107
6.4用numpy解决扩散问题 110
6.4.1内存分配和就地操作 113
6.4.2选择优化点:找到需要被修正的地方 116
6.5 numexpr:让就地操作更快更简单 120
6.6告诫故事:验证你的“优化”(scipy) 121
6.7小结 123
第7章 编译成C 126
7.1可能获得哪种类型的速度提升 127
7.2 JIT和AOT编译器的对比 129
7.3为什么类型检查有助代码更快运行 129
7.4使用C编译器 130
7.5复习Julia集的例子 131
7.6 Cython 131
7.6.1使用Cython编译纯Python版本 132
7.6.2 Cython注解来分析代码块 134
7.6.3增加一些类型注解 136
7.7 Shed Skin 140
7.7.1构建扩展模块 141
7.7.2内存拷贝的开销 144
7.8 Cython和numpy 144
7.9 Numba 148
7.10 Pythran 149
7.11 PyPy 151
7.11.1垃圾收集的差异 152
7.11.2运行PyPy并安装模块 152
7.12什么时候使用每种工具 154
7.12.1其他即将出现的项目 155
7.12.2一个图像处理单元(GPU)的注意点 156
7.12.3一个对未来编译器项目的展望 157
7.13外部函数接口 157
7.13.1 ctypes 158
7.13.2 cffii 160
7.13.3 f2py 163
7.13.4 CPython模块 166
7.14小结 170
第8章 并发 171
8.1异步编程介绍 172
8.2串行爬虫 175
8.3 gevent 177
8.4 tornado 182
8.5 AsyncIO 185
8.6数据库的例子 188
8.7小结 191
第9章multiprocessing模块 193
9.1 multiprocessing模块综述 196
9.2使用蒙特卡罗方法来估算pi 198
9.3使用多进程和多线程来估算pi 199
9.3.1使用Python对象 200
9.3.2并行系统中的随机数 207
9.3.3使用numpy 207
9.4寻找素数 210
9.5使用进程间通信来验证素数 221
9.5.1串行解决方案 225
9.5.2 Naive Pool解决方案 225
9.5.3 Less Naive Pool解决方案 226
9.5.4使用Manager.Value作为一个标记 227
9.5.5使用Redis作为一个标记 229
9.5.6使用RawValue作为一个标记 232
9.5.7使用mmap作为一个标记 232
9.5.8使用mmap作为一个标记的终极效果 234
9.6用multiprocessing来共享numpy数据 236
9.7同步文件和变量访问 243
9.7.1文件锁 243
9.7.2给Value加锁 247
9.8小结 249
第10章 集群和工作队列 251
10.1集群的益处 252
10.2集群的缺陷 253
10.2.1糟糕的集群升级策略造成华尔街损失4.62亿美元 254
10.2.2 Skype的24小时全球中断 255
10.3通用的集群设计 255
10.4怎样启动一个集群化的解决方案 256
10.5使用集群时避免痛苦的方法 257
10.6三个集群化解决方案 258
10.6.1为简单的本地集群使用Parallel Python模块 259
10.6.2使用IPython Parallel来支持研究 260
10.7为鲁棒生产集群的NSQ 265
10.7.1队列 265
10.7.2发布者/订阅者 266
10.7.3分布式素数计算器 268
10.8看一下其他的集群化工具 271
10.9小结 272
第11章 使用更少的RAM 273
11.1基础类型的对象开销高 274
11.2理解集合中的RAM使用 278
11.3字节和Unicode的对比 280
11.4高效地在RAM中存储许多文本 281
11.5使用更少RAM的窍门 290
11.6概率数据结构 291
11.6.1使用1字节的Morris计数器来做近似计数 292
11.6.2 K最小值 295
11.6.3布隆过滤器 298
11.6.4 LogLog计数器 303
11.6.5真实世界的例子 307
第12章 现场教训 311
12.1自适应实验室(Adaptive Lab)的社交媒体分析(SoMA) 311
12.1.1自适应实验室(Adaptive Lab)使用的Python 312
12.1.2 SoMA的设计 312
12.1.3我们的开发方法论 313
12.1.4维护SoMA 313
12.1.5对工程师同行的建议 313
12.2使用RadimRehurek.com让深度学习飞翔 314
12.2.1最佳时机 314
12.2.2优化方面的教训 316
12.2.3总结 318
12.3在Lyst.com的大规模产品化的机器学习 318
12.3.1 Python在Lyst的地位 319
12.3.2集群设计 319
12.3.3在快速前进的初创公司中做代码评估 319
12.3.4构建推荐引擎 319
12.3.5报告和监控 320
12.3.6一些建议 320
12.4在Smesh的大规模社交媒体分析 321
12.4.1 Python在Smesh中的角色 321
12.4.2平台 321
12.4.3高性能的实时字符串匹配 322
12.4.4报告、监控、调试和部署 323
12.5 PyPy促成了成功的Web和数据处理系统 324
12.5.1先决条件 325
12.5.2数据库 325
12.5.3 Web应用 326
12.5.4 OCR和翻译 326
12.5.5任务分发和工作者 327
12.5.6结论 327
12.6在Lanyrd.com中的任务队列 327
12.6.1 Python在Lanyrd中的角色 328
12.6.2使任务队列变高性能 328
12.6.3报告、监控、调试和部署 328
12.6.4对开发者同行的建议 329