惊艳!老司机熬夜总结的 Python 高性能编程,高效、稳定、快速!
Python 语言是一种脚本语言,其应用领域非常广泛,包括数据分析、自然语言处理机器学习、科学计算、推荐系统构建等。
能够轻松实现和代码跑得够快之间的取舍却是一个世人皆知且令人惋惜的现象而这个问题其实是可以解决的。
有些人想要让顺序执行的过程跑得更快。有些人需要利用多核架构、集群,或者图形处理单元的优势来解决他们的问题。有些人需要可伸缩系统在保证可靠性的前提下酌情或根据资金多少处理更多或更少的工作。有些人意识到他们的编程技巧,通常是来自其他语言,可能不如别人的自然。
今天给小伙伴们分享一份 Python 高性能编程手册,这份手册涵盖了上面提到的所有主题,并给出指导去了解瓶颈并提出效率更高、伸缩性更好的解决方案。
![](https://static001.geekbang.org/infoq/1d/1d582ed52bdc9a52bfdaeb4828783ae5.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
限于文章篇幅原因,只能以截图的形式展示出来,有需要的小伙伴 点击这里凭本文截图即可获取!
第 1 章 理解高性能 Python
计算机架构有哪些元素?
常见的计算机架构有哪些?
计算机架构在 Python 中的抽象表达是什么?
实现高性能 Python 代码的障碍在哪里?
性能问题有哪些种类?
![](https://static001.geekbang.org/infoq/6e/6efabf98f1964a4b8113a460927e9ff1.png)
第 2 章 通过性能分析找到瓶颈
如何找到代码中速度和 RAM 的瓶颈?
如何分析 CPU 和内存使用情况?
我应该分析到什么深度?
如何分析一个长期运行的应用程序?
在 CPython 台面下发生了什么?
如何在调整性能的同时确保功能的正确?
![](https://static001.geekbang.org/infoq/41/41f05cf4ef1d88b5d82e6c92dff67d37.png)
第 3 章 列表和元组
列表和元组各自适用于什么情况?
查询列表/元组的复杂度是什么?
该复杂度是如何计算出来的?
列表和元组的区别是什么?
向列表添加新项目是如何实现的?
我应该在什么情况下使用列表和元组?
![](https://static001.geekbang.org/infoq/ff/ffc88fcbaad7a81cce8bc00098531aff.png)
第 4 章 字典和集合
字典和集合各自适用于什么情况?
字典和集合的共同点是什么?
字典的开销在哪里?
我如何优化字典的性能?
Python 如何使用字典记录命名空间?
![](https://static001.geekbang.org/infoq/1e/1e0d6b48e311a56fc720fe8d1fa827fd.png)
第 5 章 迭代器和生成器
生成器是怎样节约内存的?
使用生成器的最佳时机是什么?
我如何使用 itertools 来创建复杂的生成器工作流?
延迟估值何时有益,何时无益?
![](https://static001.geekbang.org/infoq/06/06df7fdb1db915f1f7c3da70c24f946c.png)
第 6 章 矩阵和矢量计算
矢量计算的瓶颈在哪里?
我可以用什么工具查看 CPU 进行计算时的效率?
numpy 为什么比纯 Python 更适合数值计算?
cache-miss 和 page-faults 是什么?
我如何追踪代码中的内存分配?
![](https://static001.geekbang.org/infoq/49/49b47ab6f54e02c5155aa0ce1182a751.png)
第 7 章 编译成 C
我怎么让我的 Python 代码作为低级代码来运行?
JIT 编译器和 AOT 编译器的区别是什么?
编译后的 Python 代码运行什么任务能够比本地 Python 快?
为什么类型注解提升了编译后 Python 代码的运行速度?
我该怎样使用 C 或 Fortran 为 Python 编写模块?
我该怎样在 Python 中使用 C 或者 Fortran 的库?
![](https://static001.geekbang.org/infoq/de/def6d240af205da5c9075459db1ea0f3.png)
第 8 章 并发
什么是并发,它如何起帮助作用?
并发和并行的区别是什么?
什么任务能够用并发来做,什么不能做?
并发的各种模式是什么?
什么时候是利用并发的合适时机?
并发如何来加速我们的程序?
![](https://static001.geekbang.org/infoq/53/53b3c26c3cc3883e189441eb03ae7127.png)
第 9 章 multiprocessing 模块
multiprocessing 模块提供了什么?
进程和线程的区别是什么?
我该如何选择合适大小的进程池?
我该如何使用非持久队列来处理工作?
进程间通信的代价和好处是什么?
我该如何用多 CPU 来处理 numpy 数据?
为什么我需要加锁来避免数据丢失?
![](https://static001.geekbang.org/infoq/4c/4cd2dd5d12600773c1abe26af1da5df1.png)
第 10 章 集群和工作队列
为什么集群是有用的?
集群的代价是什么?
我该如何把一个多进程的解决方案转换成一个集群解决方案?
IPython 集群如何工作?
NSQ 是怎样有助于创建鲁棒的生产系统?
![](https://static001.geekbang.org/infoq/19/195ea8dc5bd25e579152bbbb424d7929.png)
第 11 章 使用更少的 RAM
为什么我应该使用更少的 RAM?
为什么 numpy 和 array 对存储大量数字而言更有利?
怎样把许多文本高效地存储进 RAM?
我该如何能仅仅使用一个字节来(近似地)计数到 1e77?
什么是布隆过滤,为什么我可能会需要它们?
![](https://static001.geekbang.org/infoq/a9/a90bcfda2a3719d43a3a59dc1a963b62.png)
第 12 章 现场教训
成功的创业公司如何处理大量的数据和机器学习?
什么样的监控和部署技术让系统保持稳定?
成功的 CTO 学到了关于技术和团队的什么教训?
PyPy 怎样被广泛部署?
![](https://static001.geekbang.org/infoq/a5/a5fc631d3e15d1318e1c2987e3567736.png)
限于文章篇幅原因,就展示到这里了,有需要的小伙伴 点击这里凭本文截图即可获取!
评论