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
やっぱり、メモリは節約出来るようです。