添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
当变量被赋值给另一个对象时,原对象的引用计数也会减少。例如 x = 4,这时候 3 这个对象的引用计数就减 1 了;
  • 使用 del 删除一个变量也会导致对象引用减少。例如 del x;
  • 对象从集合对象中移除。例如 lst.remove(x);
  • 包含对象的集合对象被销毁。例如 del lst;
  • 这些操作都可能使对象变成垃圾回收对象,由垃圾收集器负责收集,当然垃圾收集器也负责处理循环引用对象。

    试一下

    >>> from pympler import tracker
    >>> import random
    >>> tr = tracker.SummaryTracker()
    >>> a = [[random.random() for i in range(2000)] for i in range(2000)]
    >>> tr.print_diff()
                                                         types |   # objects |   total size
    ========================================================== | =========== | ============
                                                         float |     4000000 |     91.55 MB
                                                          list |        4286 |     31.82 MB
                                                           str |        2035 |    109.42 KB
                                                          dict |          86 |     87.34 KB
                                                           int |         233 |      5.46 KB
      <class 'pyreadline.lineeditor.lineobj.ReadLineTextBuffer |          84 |      4.59 KB
                                            wrapper_descriptor |           9 |    648     B
                                                       unicode |           5 |    260     B
                                             getset_descriptor |           4 |    256     B
                                             member_descriptor |           3 |    192     B
                                                       weakref |           2 |    160     B
                                                          code |           1 |    128     B
                                         function (store_info) |           1 |    112     B
                                                          cell |           2 |     96     B
                                                         tuple |           0 |      8     B
    >>> import gc
    >>> gc.collect()
    >>> from sys import getsizeof
    >>> getsizeof(a)
    16560
    

    用getsizeof(a) 取到的只是a一个list的object的大小 实际的大小要加上a里的4000000个float和2000个list的大小 所以这个2000 * 2000的list大小应该是120多mb

    gc也没什么好collect的

    想要占的少一点 最简单的方法是 用Numpy

    >>> tr = tracker.SummaryTracker()
    >>> a = array([[random.random() for i in range(2000)] for i in range(2000)])
    >>> tr.print_diff()
                                                         types |   # objects |   total size
    ========================================================== | =========== | ============
                                                 numpy.ndarray |           1 |     30.52 MB
                                                          list |        3586 |    351.42 KB
                                                           str |        3315 |    178.17 KB
                                                          dict |          93 |     94.45 KB
                                                           int |         352 |      8.25 KB
      <class 'pyreadline.lineeditor.lineobj.ReadLineTextBuffer |          91 |      4.98 KB
                                            wrapper_descriptor |           9 |    648     B
                                                       unicode |           5 |    260     B
                                             getset_descriptor |           4 |    256     B
                                                       weakref |           3 |    240     B