相关疑难解决方法(0)

list()比列表理解使用更多的内存

所以我正在玩list对象,并发现一些奇怪的事情,如果list创建list()它使用更多的内存,而不是列表理解?我正在使用Python 3.5.2

In [1]: import sys
In [2]: a = list(range(100))
In [3]: sys.getsizeof(a)
Out[3]: 1008
In [4]: b = [i for i in range(100)]
In [5]: sys.getsizeof(b)
Out[5]: 912
In [6]: type(a) == type(b)
Out[6]: True
In [7]: a == b
Out[7]: True
In [8]: sys.getsizeof(list(b))
Out[8]: 1008
Run Code Online (Sandbox Code Playgroud)

来自文档:

列表可以通过以下几种方式构建:

  • 使用一对方括号表示空列表: []
  • 使用方括号,用逗号分隔项目:[a],[a, b, c]
  • 使用列表理解: [x for x in iterable]
  • 使用类型构造函数:list()list(iterable)

但似乎使用list()它会占用更多内存. …

python cpython list-comprehension list python-internals

78
推荐指数
2
解决办法
3295
查看次数

列表和数组在存储值时有何不同?

我正在阅读O'Reilly 出版的 Luciano Ramalho所著的Fluent Python一书。在第二章中,作者提出了一个定义容器序列和平面序列的有趣语句。

容器序列:list、tuple 和 collections.deque 可以容纳不同类型的项目。

平面序列:str、bytes、bytearray、memoryview 和 array.array 保存一种类型的项目。

然后他继续说:-

容器序列保存对它们包含的对象的引用,这些对象可以是任何类型,而平面序列物理地将每个项目的值存储在其自己的内存空间中,而不是作为不同的对象。因此,平面序列更紧凑,但它们仅限于保存原始值,如字符、字节和数字。*

这让我想到,如果列表存储对它们正在存储的对象的引用,那么像数组这样的平面序列以什么方式存储其元素的值?作者说扁平序列物理存储了每个项目的价值。他是什么意思?

这是我第一次提问。请原谅我在这方面缺乏知识。

python arrays list sequence

3
推荐指数
1
解决办法
52
查看次数