65

次のように、配列と辞書オブジェクトのバイトサイズを知る簡単な方法を探していました

[ [1,2,3], [4,5,6] ] or { 1:{2:2} }

多くのトピックでは、pylab を使用するように言われています。たとえば、次のようになります。

from pylab import *

A = array( [ [1,2,3], [4,5,6] ] )
A.nbytes
24

しかし、辞書はどうですか?pysize または heapy の使用を提案する多くの回答を見ました。このリンクで Torsten Marek が簡単な答えを提供しています。、しかし、バイト数が一致しなかったため、出力について明確な解釈がありません。

Pysize はもっと複雑なようで、まだ使い方がはっきりしていません。

私が実行したいサイズ計算の単純さ(クラスも複雑な構造もありません)を考えると、この種のオブジェクトのメモリ使用量のおおよその見積もりを取得する簡単な方法についてのアイデアはありますか?

敬具。

4

7 に答える 7

63

あります:

>>> import sys
>>> sys.getsizeof([1,2, 3])
96
>>> a = []
>>> sys.getsizeof(a)
72
>>> a = [1]
>>> sys.getsizeof(a)
80

しかし、Python はオブジェクトごとにオーバーヘッドがあり、他のオブジェクトへの参照だけを含むオブジェクトがあるため、それほど信頼できるとは言えません。したがって、C や他の言語とはまったく同じではありません。

sys.getsizeofのドキュメントを読んで、そこから進んでください。

于 2012-11-23T14:13:11.813 に答える
32

パーティーには少し遅れましたが、dict のサイズを取得する簡単な方法は、最初にピクルすることです。

Python オブジェクト (辞書を含む) で sys.getsizeof を使用すると、参照されるオブジェクトがカウントされないため、正確ではない場合があります。

これを処理する方法は、文字列にシリアル化し、文字列に対して sys.getsizeof を使用することです。結果はあなたが望むものにはるかに近くなります。

import cPickle

mydict = {'key1':'some long string, 'key2':[some, list], 'key3': whatever other data}

sys.getsizeof(mydict) の実行は正確ではないため、最初にピクルします

mydict_as_string = cPickle.dumps(mydict)

これで、どのくらいのスペースが必要かを知ることができます

print sys.getsizeof(mydict_as_string)
于 2013-05-15T19:42:24.050 に答える
13

ここから取ったこのレシピを使用してください:

http://code.activestate.com/recipes/577504-compute-memory-footprint-of-an-object-and-its-cont/

from __future__ import print_function
from sys import getsizeof, stderr
from itertools import chain
from collections import deque
try:
    from reprlib import repr
except ImportError:
    pass

def total_size(o, handlers={}, verbose=False):
    """ Returns the approximate memory footprint an object and all of its contents.

    Automatically finds the contents of the following builtin containers and
    their subclasses:  tuple, list, deque, dict, set and frozenset.
    To search other containers, add handlers to iterate over their contents:

        handlers = {SomeContainerClass: iter,
                    OtherContainerClass: OtherContainerClass.get_elements}

    """
    dict_handler = lambda d: chain.from_iterable(d.items())
    all_handlers = {tuple: iter,
                    list: iter,
                    deque: iter,
                    dict: dict_handler,
                    set: iter,
                    frozenset: iter,
                   }
    all_handlers.update(handlers)     # user handlers take precedence
    seen = set()                      # track which object id's have already been seen
    default_size = getsizeof(0)       # estimate sizeof object without __sizeof__

    def sizeof(o):
        if id(o) in seen:       # do not double count the same object
            return 0
        seen.add(id(o))
        s = getsizeof(o, default_size)

        if verbose:
            print(s, type(o), repr(o), file=stderr)

        for typ, handler in all_handlers.items():
            if isinstance(o, typ):
                s += sum(map(sizeof, handler(o)))
                break
        return s

    return sizeof(o)


##### Example call #####

if __name__ == '__main__':
    d = dict(a=1, b=2, c=3, d=[4,5,6,7], e='a string of chars')
    print(total_size(d, verbose=True))
于 2016-02-03T08:57:46.120 に答える