- 内容提要
- 前言
- 作者简介
- 封面简介
- 第1章 理解高性能 Python
- 第2章 通过性能分析找到瓶颈
- 2.1 高效地分析性能
- 2.2 Julia 集合的介绍
- 2.3 计算完整的 Julia 集合
- 2.4 计时的简单方法——打印和修饰
- 2.5 用 UNIX 的 time 命令进行简单的计时
- 2.6 使用 cProfile 模块
- 2.7 用 runsnakerun 对 cProfile 的输出进行可视化
- 2.8 用 line_profiler 进行逐行分析
- 2.9 用 memory_profiler 诊断内存的用量
- 2.10 用 heapy 调查堆上的对象
- 2.11 用 dowser 实时画出变量的实例
- 2.12 用 dis 模块检查 CPython 字节码
- 2.13 在优化期间进行单元测试保持代码的正确性
- 2.14 确保性能分析成功的策略
- 2.15 小结
- 第3章 列表和元组
- 第4章 字典和集合
- 第5章 迭代器和生成器
- 第6章 矩阵和矢量计算
- 第7章 编译成 C
- 第8章 并发
- 第9章 multiprocessing 模块
- 第10章 集群和工作队列
- 第11章 使用更少的 RAM
- 第12章 现场教训
11.5 使用更少 RAM 的窍门
一般来说,如果你能够避免把它放进RAM,就去做。你所加载的每样东西都耗费你的RAM。你可能会加载你的部分数据,例如使用一个内存映射;或者,你可能会使用生成器来加载你所需的部分数据,为了局部计算,而不是把它一次性全部加载进来。
如果你正用数字型的数据来工作,那么你几乎肯定会想要转而使用numpy数组——该包提供了许多直接工作在底层基本类型对象上的快速算法。与使用数字的列表相比,RAM上的节省是巨大的,而且时间上的节省也一样令人惊奇。
在本书中你已经注意到我们一般使用xrange,而不是range,只是因为(在Python 2.x中)xrange是一个产生器,然而range却构建了一个完整的列表。构建一个100000000个整数的列表仅仅用来遍历正确的次数是过分的——RAM耗费巨大而且完全不必要。Python 3.x把range变成了一个产生器,这样你不再需要做这种改变。
如果你正使用字符串工作,并且你用的是Python 2.x,如果你想要节约RAM,设法坚持使用str而不是unicode。如果你贯穿整个程序需要许多Uncode对象,你可能通过简单地升级到Python 3.3+,就能受到更好的服务。如果你正要在一个静态结构中存储大量的Uncode对象,那么你可能想要调查下我们刚才讨论过的DAWG和trie树结构。
如果你正用许多比特字串来工作,调查下numpy和bitarray包,它们都有把比特打包进字节的高效表示。你可能也会受益于查看Redis,它提供了高效的比特模式存储。
PyPy项目正在试验更高效的同质数据结构的表示,这样相同的基本类型(例如,整数)的长列表在PyPy中要比在CPython中的等价结构体可能耗费要少得多。Micro Python项目会让任何工作于嵌入式系统的人产生兴趣。它是一个缩微内存印记的,试图兼容于Python 3的Python实现。
这(几乎!)不用我说,你要知道当你设法优化RAM使用时,你必须要做基准测试,并且在你改变算法前,有一个适当的单元测试集会产生一个优厚的报酬。
已经回顾了几种高效地压缩字符串和存储数字的方法后,我们现在将看看以精度换取存储空间。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论