5

例:

import sys

class Test():
    def __init__(self):
        self.a = 'a'
        self.b = 'b'
        self.c = 'c'
        self.d = 'd'
        self.e = 'e'

if __name__ == '__main__':
    test = [Test() for i in range(100000)]
    print(sys.getsizeof(test))

Windows タスク マネージャー: 100000 対 10 のリストを作成すると、20 MB もジャンプします。

sys.getsizeoff() の使用: 100000 のリストの場合、412,236 バイトを取得します。10 個のリストの場合、100 バイトになります。

これは非常に不釣り合いに思えます。なぜこうなった?

4

2 に答える 2

2

割り当てられたメモリは不均衡ではありません。100,000 個のオブジェクトを作成しています! ご覧のとおり、これらは約 34 メガバイトのスペースを占有します。

>>> sys.getsizeof(Test())+sys.getsizeof(Test().__dict__)
344
>>> (sys.getsizeof(Test())+sys.getsizeof(Test().__dict__)) * 1000000 / 10**6
34.4 #megabytes

を使用するとわずかな改善が得られますが__slots__、100,000 個のオブジェクトを保存するには、まだ約 20MB のメモリが必要です。

>>> sys.getsizeof(Test2())+sys.getsizeof(Test2().__slots__)
200
>>> sys.getsizeof(Test2())+sys.getsizeof(Test2().__slots__) * 1000000 / 10**6
20.0 #megabytes

( mensi's answer の功績により、sys.getsizeof参照は考慮されていません。オブジェクトのほとんどの属性を表示するためにオートコンプリートできます。)

SO の回答を参照してください: __slots__ の使用法? http://docs.python.org/release/2.5.2/ref/slots.html

使用するには__slots__

class Test2():
    __slots__ = ['a','b','c','d','e']

    def __init__(self):
        ...
于 2012-07-31T23:05:40.200 に答える
1

__dict__すべてのインスタンスは、私のマシンでは 272 バイトの dict を参照します。それに 100,000 を掛けます。

于 2012-07-31T23:09:19.760 に答える