1

When I try delete an element from python list the size of whole list is still the same.

import numpy as np
import sys

l = [np.arange(4) for i in range(4)]
print("size: {}".format(sys.getsizeof(l)))
index = 1
l[index] = None
del l[index]
print("size: {}".format(sys.getsizeof(l)))

show:

size: 96
size: 96

How to release memory after deleteing item? gc.collect() does not work.

abc
  • 11,579
  • 2
  • 26
  • 51
wuullif56
  • 43
  • 1
  • 5
  • 6
    honestly, i wouldn't worry about it, it's almost certainly a micro-optimization, life is too short ;) – Chris_Rands May 10 '19 at 13:46
  • You'd have to re-create the list, e.g. `l=l[:]`, but the cost of re-allocation will times overweight the saved few bytes. Normally people are not supposed to care about those things when they code in Python, and even in C++ erasing a vector element does not change the allocated size. – bereal May 10 '19 at 13:52
  • Well explained [here](https://stackoverflow.com/questions/12417498/how-to-release-used-memory-immediately-in-python-list) – Ugo T. May 10 '19 at 13:54

2 Answers2

1

list is very cleverly implemented to allocate a small bit of over-allocation. So,

>>> l = []
>>> sys.getsizeof(l) 
# i have a 64-bit system. This value would have been different in a 32-bit,
# and this is basic memory required by the data structure itself. Over time the append happens,
# the memory will be increased on a bit more than required.  
# The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
72
>>> l.append(1)
>>> sys.getsizeof(l)
104
>>> l.append(2)
>>> sys.getsizeof(l)
104
>>> l
[1, 2]
>>> for i in range(100):l.append(i)
... 
>>> l
[1, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> sys.getsizeof(l)
920

So if you were to empty the list, you will get

>>> l[:] = []
>>> sys.getsizeof(l)
72
han solo
  • 6,390
  • 1
  • 15
  • 19
1

Python has built-in garbage collection and you don't have to manually release memory. Calling del on a list item removes that item from the list (same as the pop method when deleting a single index), but it offers no guarantees for actually freeing the underlying memory.

The reason why forcing a garbage collection with gc.collect() doesn't work is because the CPython list implementation tries to minimise the number of malloc and free calls overall, so in this case even after the element has been removed, they keep around the memory in case you'd assign a new element shortly after.

Agost Biro
  • 2,709
  • 1
  • 20
  • 33