我需要在内存中存储一个大型数字列表,然后需要进行成员检查。数组比列表更具有内存效率,而Set比列表更适合用于成员检查。我都需要!所以我的问题是:
1)数组比Set更节省多少内存?(相反的情况,请查看下面的结果)。 2)是否有一种数据结构可以在Set和数组之间取得更好的平衡?类似于带有带符号整数类型的Set?或者一些Numpy构造?
我使用以下脚本检查了成员资格时间差异。(我知道timeit更好,但方差足够低,时间就可以了):
import array
import time
class TimerContext:
def __enter__(self):
self.t0 = time.time()
def __exit__(self, *args, **kwargs):
print(time.time()-self.t0)
SIZE = 1000000
l = list([i for i in range(SIZE)])
a = array.array('I', l)
s = set(l)
print(type(l))
print(type(a))
print(type(s))
with TimerContext():
x = 99999 in l
with TimerContext():
x = 99999 in a
with TimerContext():
x = 99999 in s
结果:
<class 'list'>
<class 'array.array'>
<class 'set'>
0.0012176036834716797
0.0024595260620117188
1.430511474609375e-06
因为集合在成员检查方面速度非常快(请注意科学计数法)。所以如果它们的内存占用与数组相差不大,我会更喜欢使用集合。但我不知道如何检查内存占用。
另外,有很多关于比较集合和列表的问题。但我没有看到任何关于比较数组和集合的好答案。
sys.getsizeof
显示,对于你的示例而言,集合比数组大约多 8 倍。https://docs.python.org/3/library/sys.html#sys.getsizeof. - CristiFati