【问题标题】:Size of list and string列表和字符串的大小
【发布时间】:2016-10-17 19:43:10
【问题描述】:

我正在尝试获取列表的大小(以字节为单位)以及字符串的大小(以字节为单位)。

如果我们看到下面的代码输出,列表的大小显示为52 bytes,而当我加入列表并检查大小时,输出为35 bytes。最后我尝试获取字符串"Iamtestingsize" 的大小,输出又是35 bytes。所以,“join”后的字符串大小和“Iamtestingsize”字符串的大小是一样的。

我有两个问题:

1) 为什么列表的大小显示不同的输出?另外,如果您对如何获取列表内容的大小有任何想法,请告诉我?

2) 我想,1 字节 == 1 个字符,我期望字符串 msgstr 和字符串的大小将显示为 14 个字节而不是 35 个。如果这里有任何遗漏,请告诉我?

3) 当我对列表和字符串执行 len() 时,对于 msgstr 和字符串 - 返回 14 而列表长度返回 4,这与我预期的一样。

import sys

list = ['I', 'am', 'testing', 'size']
print sys.getsizeof(list)
msgstr = "".join(list)
print "size of msgstr is " + str(sys.getsizeof(msgstr))
print msgstr
string = "Iamtestingsize"
print "size of str is " + str(sys.getsizeof(string))
print len(list)
print len(msgstr)
print len(string)

Output:

52
size of msgstr is 35
Iamtestingsize
size of str is 35
4
14
14

注意:我使用的是 python 2.7

【问题讨论】:

  • 字符串对象占用的内存有一些固定的开销。当我尝试它时,我一直得到size-len==37。列表和字符串需要不同的内存量,因为它们是完全不同类型的对象。没有理由它们应该是一样的。

标签: python python-2.7


【解决方案1】:
  1. 列表(任何列表)数据结构需要额外的维护开销才能将元素保留在其中。这种开销反映在getsizeof 的结果差异上。

  2. Python 字符串是 text sequence type - str,而不是 C 字符串或类似的字符串。与 Python 列表一样,除了字符串的内容之外,还涉及相关的元数据:


Python 2.7.10 (default, Jul 30 2016, 18:31:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getsizeof(b'asd')
40
>>> sys.getsizeof('asd')
40
>>> sys.getsizeof(u'asd')
56

  1. 字符串的长度直观地定义为其中的字符数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多