Why I fail so bad to check for memory leak with this code?

Marco Sulla Marco.Sulla.Python at gmail.com
Thu Jul 21 15:47:13 EDT 2022


I tried to check for memory leaks in a bunch of functions of mine using a
simple decorator. It works, but it fails with this code, returning a random
count_diff at every run. Why?

import tracemalloc
import gc
import functools
from uuid import uuid4
import pickle

def getUuid():
    return str(uuid4())

def trace(func):
    @functools.wraps(func)
    def inner():
        tracemalloc.start()

        snapshot1 = tracemalloc.take_snapshot().filter_traces(
            (tracemalloc.Filter(True, __file__), )
        )

        for i in range(100):
            func()

        gc.collect()

        snapshot2 = tracemalloc.take_snapshot().filter_traces(
            (tracemalloc.Filter(True, __file__), )
        )

        top_stats = snapshot2.compare_to(snapshot1, 'lineno')
        tracemalloc.stop()

        for stat in top_stats:
            if stat.count_diff > 3:
                raise ValueError(f"count_diff: {stat.count_diff}")

    return inner

dict_1 = {getUuid(): i for i in range(1000)}

@trace
def func_76():
    pickle.dumps(iter(dict_1))

func_76()


More information about the Python-list mailing list