Python集合是否比list更节省空间?

Python集合是否比list更节省空间?,python,Python,list已知会使用大量空间进行初始化,以优化扩展列表所需的时间(平均而言,我们不必像数组一样不断创建新列表) 设置怎么样 由于list,下面的结构会浪费空间。我理解tuple更节省空间,因为它是不可变的。我们可以对设置执行相同的操作,并且仍然是可变的吗 set([1,2,3]) sets比lists占用更多内存。sets提供的一些功能需要更多的内存(例如快速成员资格测试)。对于小列表,set可能会占用10倍的内存,但在较大的列表中,由于某些原因,这会减少到3倍左右。(可能是由于哈希表冲突导致链表

list
已知会使用大量空间进行初始化,以优化扩展列表所需的时间(平均而言,我们不必像数组一样不断创建新列表)

设置
怎么样

由于
list
,下面的结构会浪费空间。我理解
tuple
更节省空间,因为它是不可变的。我们可以对
设置
执行相同的操作,并且仍然是可变的吗

set([1,2,3])


set
s比
list
s占用更多内存。
set
s提供的一些功能需要更多的内存(例如快速成员资格测试)。

对于小列表,set可能会占用10倍的内存,但在较大的列表中,由于某些原因,这会减少到3倍左右。(可能是由于哈希表冲突导致链表链接,这会减慢查找速度,但有助于内存使用?)

在python3中,getsizeof(range())总是返回一个常量,因为range对象有点像迭代器,所以我尝试通过创建实际列表来测试这一点。 编辑:我本可以尝试使用getsizeof(list(range()))


那很有趣。看起来它必须保留更多的东西。。。。不管什么原因。与快速(可能是对数)成员资格测试相比,需要更多内存。列表中的成员资格测试在时间上当然是线性的。而且似乎上一个测试有缺陷,不管测试大小如何,它在我的机器上返回64。@liori Strange(我也遇到过)。我想
getsizeof
的一个缺点是。删除了那个测试。
>>> from sys import getsizeof as size
>>> s = set(xrange(100))
>>> l = list(xrange(100))
>>> size(s)
8424
>>> size(l)
1016
from sys import getsizeof # returns memory size in bytes
list_lengths = [100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000] # from 100 to 1billion
for length in list_lengths:
     my_list = [num for num in range(length)]
     my_set = set(my_list)
     print("list length: {}".format(len(my_list)))
     print("memory size of my_list: {}".format(getsizeof(my_list)))
     print("memory size of my_set: {}".format(getsizeof(my_set)))
     print("set to list size ratio: {}".format(getsizeof(my_set)/getsizeof(my_list)))


Output:
list length: 100
memory size of my_list: 912
memory size of my_set: 8416
set to list size ratio: 9.228070175438596
list length: 1000
memory size of my_list: 9024
memory size of my_set: 32992
set to list size ratio: 3.6560283687943262
list length: 10000
memory size of my_list: 87624
memory size of my_set: 524512
set to list size ratio: 5.985939925134666
list length: 100000
memory size of my_list: 824464
memory size of my_set: 4194528
set to list size ratio: 5.087581750082478
list length: 1000000
memory size of my_list: 8697464
memory size of my_set: 33554656
set to list size ratio: 3.8579815909557085
list length: 10000000
memory size of my_list: 81528056
memory size of my_set: 268435680
set to list size ratio: 3.2925558779421897
list length: 100000000
memory size of my_list: 859724472
memory size of my_set: 4294967520
set to list size ratio: 4.995748824048828
list length: 1000000000
memory size of my_list: 8058558880
memory size of my_set: 34359738592 # my computer doesn't have this much memory, not sure what's going on here. Maybe it's writing to SSD
set to list size ratio: 4.263757218089594