的情况48
2.11.1使用模块dis查看CPython字节码48
2.11.2复杂度随方法而异50
2.12优化期间使用单元测试确保代码正确52
2.13确保代码剖析成功的策略55
2.14小结56
第3章 列表和元组57
3.1更高效的查找方式60
3.2比较列表和元组62
3.2.1作为动态数组的列表63
3.2.2作为静态数组的元组66
3.3小结67
第4章 字典和集合69
4.1字典和集合的工作原理72
4.1.1插入和检索72
4.1.2删除76
4.1.3调整长度76
4.1.4散列函数和熵76
4.2字典和名称空间80
4.3小结83
第5章 迭代器和生成器84
5.1无穷数列迭代器88
5.2延迟执行生成器89
5.3小结93
第6章 矩阵和向量计算94
6.1问题简介95
6.2Python列表不够好吗99
6.3内存碎片104
6.3.1理解perf106
6.3.2根据perf的输出做决策108
6.3.3进入numpy108
6.4使用numpy解决扩散问题111
6.4.1内存分配和就地操作114
6.4.2有选择地优化:找出需要修复的地方118
6.5numexpr:让你能够更快、更轻松地执行就地操作121
6.6警示故事:对优化进行验证(scipy)122
6.7从矩阵优化获得的经验教训124
6.8Pandas126
6.8.1Pandas的内部模型127
6.8.2将函数应用于多行数据128
6.8.3根据部分结果而不是使用拼接来创建DataFrame和Series135
6.8.4有多种解决问题的方式(而且可能有更快的方式)136
6.8.5Pandas高效开发建议137
6.9小结138
第7章 编译成C代码139
7.1速度提升方法140
7.2JIT编译器和AOT编译器141
7.3为何类型信息有助于提高代码运行速度142
7.4使用C语言编译器143
7.5回顾朱利亚集合示例143
7.6Cython144
7.7pyximport146
7.7.1使用Cython标注选项来分析代码块146
7.7.2添加类型标注149
7.8Cython和numpy152
7.9Numba156
7.10PyPy159
7.10.1垃圾收集方面的差异160
7.10.2运行PyPy及安装模块160
7.11速度提升小结162
7.12各种技术的适用场景163
7.13图形处理单元165
7.13.1动态图:PyTorch165
7.13.2GPU基本剖析168
7.13.3GPU性能考虑因素169
7.13.4在什么情况下使用GPU170
7.14语言交互接口172
7.14.1ctypes173
7.14.2cffi175
7.14.3f2py177
7.14.4CPython模块180
7.15小结184
第8章 异步I/O186
8.1异步编程简介187
8.2async/await的工作原理190
8.2.1串行爬虫191
8.2.2gevent192
8.2.3tornado196
8.2.4aiohttp199
8.3兼具CPU密集型和I/O密集型的问题202
8.3.1串行版203
8.3.2分批处理结果204
8.3.3完全异步207
8.4小结211
第9章 模块multiprocessing213
9.1模块multiprocessing概述216
9.2使用蒙特卡罗方法估算圆周率217
9.3使用进程和线程估算圆周率219
9.3.1使用Python对象219
9.3.2使用Joblib而不是multiprocessing225
9.3.3并行系统中的随机数229
9.3.4使用numpy230
9.4查找素数232
9.5使用进程间通信验证素数242
9.5.1串行解决方案247
9.5.2朴素进程池解决方案247
9.5.3改进的朴素进程池解决方案248
9.5.4将Manager.Value用作标志249
9.5.5将Redis用作标志251
9.5.6将RawValue用作标志253
9.5.7将mmap用作标志254
9.5.8将mmap用作标志(终极版)255
9.6使用multiprocessing共享numpy数据257
9.7同步文件和变量访问263
9.7.1锁定文件263
9.7.2锁定值267
9.8小结269
第10章 集群和作业队列271
10.1集群的优点272
10.2集群的缺点273
10.2.1糟糕的集群升级策略让华尔街大牛损失4.62亿美元274
10.2.2Skype全球24小时中断服务274
10.3常见的集群设计275
10.4如何启动集群解决方案276
10.5使用集群时如何避免麻烦276
10.6两种集群解决方案277
10.6.1使用IPythonParallel为研究工作提供支持278
10.6.2使用Dask并行化Pandas281
10.7使用NSQ打造健壮的生产集群284
10.7.1队列284
10.7.2发布者/订阅者285
10.7.3分布式素数计算287
10.8其他集群工具291
10.9Docker292
10.9.1Docker的性能292
10.9.2Docker的优点295
10.10小结296
第11章 减少内存占用量297
11.1基本类型对象的开销很高298
11.1.1模块array可高效地存储大量的基本类型对象299
11.1.2使用NumExpr减少NumPy占用的内存量302
11.2理解集合占用的内存305
11.3比较字节和Unicode307
11.4在内存中高效地存储大量文本307
11.5使用scikit-learnFeatureHasher进行文本建模315
11.6DictVectorizer和FeatureHasher简介316
11.7SciPy稀疏矩阵319
11.8减少内存占用量的技巧322
11.9概率数据结构322
11.9.1使用1字节的莫里斯计数器实现非常接近的计数323
11.9.2K最小值326
11.9.3布隆过滤器329
11.9.4LogLog计数器335
11.9.5实例339
第12章 实战经验教训342
12.1使用特征引擎简化特征工程流水线342
12.1.1机器学习中的特征工程343
12.1.2艰巨的特征工程流水线部署任务343
12.1.3利用开源Python库344
12.1.4使用Feature-engine简化特征工程流水线的构建和部署工作344
12.1.5推广新的开源包345
12.1.6开发和维护开源库及鼓励积极投稿346
12.2表现出色的数据科学团队347
12.2.1需要多长时间347
12.2.2探索和规划348
12.2.3管理预期和交付349
12.3Numba350
12.3.1一个简单的示例350
12.3.2最佳实践和建议352
12.3.3寻求帮助355
12.4优化和思维356
12.5AdaptiveLab的社交媒体分析(2014)358
12.5.1AdaptiveLab的Python使用情况358
12.5.2SoMA的设计358
12.5.3开发方法359
12.5.4维护SoMA359
12.5.5给同行的建议360
12.6RadimRehurek网站如何让深度学习快步如飞(2014)360
12.6.1管用的策略360
12.6.2优化方面的经验教训362
12.6.3结语364
12.7Lyst网站可用于生产环境的大规模机器学习(2014)364
12.7.1集群设计364
12.7.2发展迅猛的初创公司中的代码迭代365
12.7.3构建推荐引擎365
12.7.4报告和监控365
12.7.5一些建议366
12.8Smesh的大规模社交媒体分析(2014)366
12.8.1Python在Smesh中扮演的角色366
12.8.2平台367
12.8.3实时高性能字符串匹配367
12.8.4报告、监控、调试和部署368
12.9使用PyPy成功地实现Web和数据处理系统(2014)369
12.9.1使用的工具370
12.9.2数据库370
12.9.3Web应用371
12.9.4OCR和翻译371
12.9.5任务分配和任务队列371
12.9.6结语372
12.10Lanyrd的任务队列(2014)372
12.10.1Python在Lanyrd扮演的角色372
12.10.2让任务队列表现出色373
12.10.3报告、监控、调试和部署373
12.10.4给同行的建议373