计算python字符串的实际大小

时间:2013-09-03 15:43:02

标签: python string python-2.7 size

首先,这是我的电脑规格:

记忆 - https://gist.github.com/vyscond/6425304

CPU - https://gist.github.com/vyscond/6425322

所以今天早上我测试了以下两个代码片段:

代码A

a = 'a' * 1000000000

和代码B

a = 'a' * 10000000000

代码A工作正常。但是代码B给了我一些错误信息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

所以我开始研究测量python数据大小的方法。

我发现的第一件事是经典的内置函数len()

代码函数len()返回值1000000000,但代码B返回了相同的内存错误。

在此之后,我决定在这些测试中获得更高的精确度。所以我在名为sys的{​​{1}}模块中找到了一个函数。通过此功能,我对代码A进行了相同的测试:

getsizeof()

结果返回sys.getsizeof( 'a' * 1000000000 ) (以字节为单位)

  • 问题1 - 这意味着1000000037千兆字节?

所以我检查了一个包含单个字符0.9313226090744

的字符串的字节数
'a'

结果返回sys.getsizeof( 'a' ) (以字节为单位)

  • 问题02 - 这意味着如果我们需要一个由 1000000000 字符38组成的字符串,这将导致38 * 1000000000 = 38.000.000.000字节?

    < / LI>
  • 问题03 - 这意味着我们需要一个35.390257835388千兆字节来保存这样的字符串?

我想知道这个推理中的错误在哪里!因为这对我没有任何意义' - '

1 个答案:

答案 0 :(得分:8)

Python对象具有最小的大小,即将几个簿记数据附加到对象上的开销。

Python str对象也不例外。看一下没有,一,二和三个字符的字符串之间的区别:

>>> import sys
>>> sys.getsizeof('')
37
>>> sys.getsizeof('a')
38
>>> sys.getsizeof('aa')
39
>>> sys.getsizeof('aaa')
40

我的机器上的Python str对象开销是37个字节,但字符串中的每个字符只占固定开销的一个字节。

因此,具有1000万个字符的str值需要1000万字节+ 37字节的内存开销。这确实是大约0.931千兆字节。

您的示例代码'B'创建了十倍以上的字符,因此您需要将近10 GB的内存来保存一个字符串,不包括Python的其余部分,操作系统以及该计算机上可能运行的其他任何内容。