我们都知道,如果内存过多,计算机会运行得更慢。在释放内存之前,首先要查看具体的内存占用量,而不是一味追求内存优化。只有找到占用的内存量,最好根据情况对应不同的内存释放方式。接下来,我们分析检测内容占用的情况,进而进一步提出解决问题的代码。
内存占用检测
下面的代码块可以检查变量 variable 所占用的内存。
import sys
variable = 30
print(sys.getsizeof(variable)) # 24
Python 是一个解释器,我们可以随时扩展我们的类,例如,通过添加一个新字段:
d1 = DataItem("Alex", 42, "-")
print ("get_size(d1):", get_size(d1))
d1.weight = 66
print ("get_size(d1):", get_size(d1))
很好,但是如果我们不需要这个功能怎么办?我们可以强制解释器使用 __slots__ 命令指定类的列表对象:
class DataItem(object):
__slots__ = ['name', 'age', 'address']
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
可以在文档 (RTFM) 中找到更多信息,其中显示“__dict__ 和 __weakref__”。使用 __dict__ 节省的空间是巨大的”。
我们确认:是的,这很重要,get_size(d1) 返回...64 字节,而不是 460 字节,减少了 7 倍。此外,对象的创建速度提高了 20%(参见本文的第一个屏幕截图)。
这并不是因为其他开销真正使用了如此大的内存增益。通过简单的添加元素创建一个 100,000 的数组,并查看内存消耗:
<p><span>data = []<br/>for p in range(100000):<br/> data.append(DataItem("Alex", 42, "middle of nowhere"))<br/>snapshot = tracemalloc.take_snapshot()<br/>top_stats = snapshot.statistics('lineno')<br/>total = sum(stat.size for stat in top_stats)<br/>print("Total allocated size: %.1f MB" % (total / (1024*1024)))<br/></span></p>
我们不使用 __slots__,它占用 16.8MB 内存,使用时占用 6.9MB。这个操作当然不是最好的,但它确实有最少的代码更改。 (当然不是 7 次,但一点也不差,考虑到代码更改很小。)
以上就是我们解决内存占用的代码方法了,关键还是要先从内存具体占用的情况开始分析,然后再进行下一步的代码操作。
更多Python学习指路:
。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python如何查看一个类的函数09/29
- ♥ 如何解决python无法连接数据库09/23
- ♥ 如何将python编译成exe08/14
- ♥ 如何在python中使用geth?12/29
- ♥ 如何在python中编写for循环语句08/15
- ♥ 如何用python打开csv10/22
内容反馈