2017-06-05 1 views
1

私の理解では、os.urandom(サイズが)その後、与えられた「サイズ」のバイトのランダムな文字列を出力しますが、ということです。このバイト文字列は実際にどのくらいのメモリを占有しますか?

import os 
import sys 

print(sys.getsizeof(os.urandom(42))) 

>>> 
75 

なぜこれが42ではないでしょうか?

および関連質問:

import base64 
import binascii 


print(sys.getsizeof(base64.b64encode(os.urandom(42)))) 
print(sys.getsizeof(binascii.hexlify(os.urandom(42)))) 

>>> 
89 
117 

なぜこれらはとても異なっていますか?どのエンコーディングが、os.urandomによって与えられたようなバイト列を格納する最もメモリ効率的な方法でしょうか?

編集:この質問はWhat is the difference between len() and sys.getsizeof() methods in python?の重複であると言うのはかなりのようです。私の質問はlen()とgetsizeof()の違いではありません。私は、Pythonオブジェクトが一般的に使用するメモリについて混乱していました。この問題に対する答えが私にはっきりと分かりました。

+0

2番目の例では、結果の文字列の長さが異なるため(base64と16進数)、等しくありません。 'getsizeof()'の結果を取り、各オブジェクトの 'len()'を減算することで、各オブジェクトがどれくらいのメモリを使用しているか把握することができます。 –

答えて

3

Pythonバイト文字列オブジェクトは、それらを構成する文字以外のものです。彼らは完全に本格的なものです。そのため、メソッド(split(),、swapcase()など)やすべてのオブジェクトに必要な内部インフラストラクチャなど、オブジェクトのコンポーネントを格納するためのスペースが必要です。

最も単純なオブジェクト、objectインスタンスは、スペースが必要です。あなたの質問の

>>> sys.getsizeof(object()) 
16 

第二部はb64encode()hexlify()によって生成文字列の長さが異なるというだけの理由です。後者は長さが28文字長く、意外にも、sys.getsizeof()によって報告された値の差です。

>>> s1 = base64.b64encode(os.urandom(42)) 
>>> s1 
b'CtlMjDM9q7zp+pGogQci8gr0igJsyZVjSP4oWmMj2A8diawJctV/8sTa' 
>>> s2 = binascii.hexlify(os.urandom(42)) 
>>> s2 
b'c82d35f717507d6f5ffc5eda1ee1bfd50a62689c08ba12055a5c39f95b93292ddf4544751fbc79564345' 

>>> len(s2) - len(s1) 
28 
>>> sys.getsizeof(s2) - sys.getsizeof(s1) 
28 

あなたが圧縮のいくつかのフォームを使用していない限り、あなたが既に持っているバイナリ文字列よりも効率的になります何のエンコーディングはありません、そしてデータがランダムあるので、これはこの場合には特にそうですは本質的に非圧縮性である。

関連する問題