1

首先这是我的电脑规格:

内存 - 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()

对于代码 A 函数len()返回 value 1000000000,但对于代码 B 返回相同的内存错误。

在此之后,我决定在此测试中获得更高的精度。所以我从sys模块中找到了一个名为getsizeof(). 使用此功能,我对代码 A 进行了相同的测试:

sys.getsizeof( 'a' * 1000000000 )

结果返回是1000000037(以字节为单位)

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

所以我用单个字符检查了字符串的字节数'a'

sys.getsizeof( 'a' )

结果返回是38(以字节为单位)

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

  • 问题 03 - 这意味着我们需要 35.390257835388 GB 来保存这样的字符串?

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

4

1 回答 1

9

Python 对象具有最小的大小,即保持多个簿记数据附加到对象的开销。

Pythonstr对象也不例外。看一下无、一、二、三字符的字符串的区别:

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

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

因此,具有str10 亿个字符的值需要 10 亿字节 + 37 字节的内存开销。这确实是大约 0.931 GB。

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

于 2013-09-03T15:56:31.980 回答