• 技术文章 >Python技术 >Python基础教程

    内存占用如何python3中的代码解决?

    小妮浅浅小妮浅浅2020-12-02 09:37:38原创3035

    我们都知道如果内存过多会导致电脑运行速度的变慢,在进行内存释放之前,我们应该先检测一下内存具体占用的数量是多少,而不是一味的追求内存的优化。只有找到内存占用的数量,才好根据情况对应不同的内存释放方法。下面我们从检测内容占用的情况分析,再进一步提出解决问题的代码。


    内存占用检测

    下面的代码块可以检查变量 variable 所占用的内存。

    1

    2

    3

    4

    import sys

      

    variable = 30

    print(sys.getsizeof(variable)) # 24

    Python是一个解释器,我们可以在任何时候扩展我们的类,例如,添加一个新的字段:

    1

    2

    3

    4

    d1 = DataItem("Alex", 42, "-")

    print ("get_size(d1):", get_size(d1))

    d1.weight = 66

    print ("get_size(d1):", get_size(d1))


    非常好,但是如果我们不需要这个功能呢?我们能强制解释器来指定类的列表对象使用__slots__命令:

    1

    2

    3

    4

    5

    6

    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的数组,并查看内存消耗:

    1

    <p style="line-height: 1.75em;"><span style="font-family: 微软雅黑, "Microsoft YaHei"; font-size: 14px;">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。这个操作当然不是最好的,但是确实代码改变的最小的。(Not 7 times of course, but it’s not bad at all, considering that the code change was minimal.)

    以上就是我们解决内存占用的代码方法了,关键还是要先从内存具体占用的情况开始分析,然后再进行下一步的代码操作。更多Python学习指路:PyThon学习网教学中心

    专题推荐:python3代码
    上一篇:字母大小写如何python3中用代码表示? 下一篇:python3压缩与解包的代码怎么写?

    相关文章推荐

    • 如何用python3代码玩小游戏?• Python3代码可以用py2exe加密吗?• python3代码怎样快速测试结果?• python3代码如何自动补全?

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网