WeakKeyDictionaryが本当にメモリ節約になるのか試してみた。

weakrefモジュールのクラスを使うと弱参照を作れます。例えば、WeakKeyDictionaryの場合、keyに使用されているobjectが他の場所で全く使用されない状態になると、自動的にWeakKeyDictionaryから削除されます。

・・・と、いうことだと思うのですが、なんか不安なので実際にメモリ使用量を測ってみました。

from __future__ import division, print_function
from weakref import WeakKeyDictionary
import random

def memorySize():
    from win32process import GetProcessMemoryInfo, GetCurrentProcess
    info = GetProcessMemoryInfo(GetCurrentProcess())
    return info["WorkingSetSize"]

class BigSpam:
    def __init__(self):
        self.x = [random.random() for x in xrange(1024)]

def main():
##    dictclass = dict
    dictclass = WeakKeyDictionary
    
    print(u"dictclass =", dictclass.__name__)
    print(u"dict生成前", memorySize() // 1024**2, "MB")
    d = dictclass()
    for i in xrange(10*1024):
        d[BigSpam()] = None
    print(u"dict生成後", memorySize() // 1024**2, "MB")
    
if "__main__" == __name__:
    main()
dictclass = <type 'dict'>
dict生成前 10 MB
dict生成後 241 MB
dictclass = WeakKeyDictionary
dict生成前 10 MB
dict生成後 10 MB

やっぱり、メモリは節約出来るようです。