2017-01-11 13 views
0

documentation для memory_profiler предлагает простой пример, показывающий изменения в использовании памяти из-за создания и удаления списка.Python memory_profiler: память не добавляется

from memory_profiler import profile 

@profile 
def my_func(): 
    a = [1] * (10 ** 6) 
    b = [2] * (2 * 10 ** 7) 
    del b 
    return a 

if __name__ == '__main__': 
    my_func() 

Который производит следующий вывод:

Line # Mem usage Increment Line Contents 
============================================== 
    3       @profile 
    4  5.97 MB 0.00 MB def my_func(): 
    5  13.61 MB 7.64 MB  a = [1] * (10 ** 6) 
    6 166.20 MB 152.59 MB  b = [2] * (2 * 10 ** 7) 
    7  13.61 MB -152.59 MB  del b 
    8  13.61 MB 0.00 MB  return a 

Когда b удаляется, его использование памяти освобожденное. Я играл и менял пример на следующий, где я также удаляю a.

from memory_profiler import profile 

@profile 
def my_func(): 
    a = [1] * (10 ** 6) 
    b = [2] * (2 * 10 ** 7) 
    del a 
    del b 
    return None 

if __name__ == '__main__': 
    my_func() 

Здесь, однако, удаление a не сопровождается - я бы наивно ожидать, - уменьшением использования памяти. На самом деле кажется, что ничего не происходит.

Line # Mem usage Increment Line Contents 
================================================ 
    12  25.1 MiB  0.0 MiB @profile 
    13        def my_func(): 
    14  32.7 MiB  7.6 MiB  a = [1] * (10 ** 6) 
    15 185.3 MiB 152.6 MiB  b = [2] * (2 * 10 ** 7) 
    16 185.3 MiB  0.0 MiB  del a 
    17  32.7 MiB -152.6 MiB  del b 
    18  32.7 MiB  0.0 MiB  return None 

Что происходит?

+0

это нормально на моей 8-Гбайт ОЗУ ubuntu 16.04 с python2.7 и memory_profiler 0.45. – suiyuan2009

ответ

0

del a действительно не удаляет объект, он просто отмечает объект как неиспользованный, но он будет удален позже, когда сборщик мусора сочтет это уместным. b достаточно большой, чтобы сборщик мусора сразу удалил его, но, по-видимому, не так для a