首先,这是我的电脑规格:
记忆 - 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 )
(以字节为单位)
1000000037
千兆字节?所以我检查了一个包含单个字符0.9313226090744
'a'
结果返回sys.getsizeof( 'a' )
(以字节为单位)
问题02 - 这意味着如果我们需要一个由 1000000000 字符38
组成的字符串,这将导致38 * 1000000000 = 38.000.000.000字节?
问题03 - 这意味着我们需要一个35.390257835388千兆字节来保存这样的字符串?
我想知道这个推理中的错误在哪里!因为这对我没有任何意义' - '
答案 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的其余部分,操作系统以及该计算机上可能运行的其他任何内容。