前言
Python慢的原因就是因为太“胖”了,而且还非常能吃,可能是抵挡不住CPU的美味的诱惑吧,多线程还不能有效利用多核,然而这货不仅吃 CPU 还吃内存,非常贪婪(- - !跟我一样是吃货,吃货本性)。
python是一个动态的解释型语言;python中的值不是存储在缓存区而是分散的存储在对象中。通过使用Numpy和Scipy等相关可以进行矢量化操作的工具并调用编译后的代码来绕过这个问题来避开这个问题
看看 Python 的对象到底有多吃内存(下面的代码都是基于 Python3.6):
对于容器类型的对象,我们得使用这段 代码 递归的计算内存大小,这里就直接复制过来了:
小编推荐一个学python的学习qun 740,3222,34
无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!
输出是这样的:
没看错,这个小小的 dict 就干掉了近 1.5K 的内存… 可以的,实力在这里大家都看得到。
当然 Python 对于小型对象会使用对象池的方式来优化内存的使用率,但是这只能应用于大量相同的小对象
cpython管理8字节边界上特殊池中的小对象(小于256字节)。有1-8字节、9-16字节和249-256字节的池。当分配大小为10的对象时,它将从16字节池中为大小为9-16字节的对象分配。因此,即使它只包含10个字节的数据,它也需要16个字节的内存。如果您分配1000000个大小为10的对象,那么实际使用的是16000000字节,而不是您可能假定的10000000字节。这60%的开销显然不是微不足道的。
所以,谨慎使用 Python 对象缓存过大的数据集,万能的 Google 告诉我们可以使用标准库 shelve / sqlite3.connect(’:memory:’) ,第三方工具 numpy / redis 以及优化过的数据结构 trie 等等来代替 dict-like 的数据集。