Nei*_*eil 10 python arrays list set
我需要在内存中存储大量数字。然后,我需要检查成员身份。数组在存储效率上优于列表。集比成员资格检查列表要好。我都需要!所以我的问题是:
1)数组比集合的内存效率高多少?(相反,请参见下面的结果)。2)是否有数据结构可以在集合和数组之间取得更好的平衡?像带有有符号整数类型的集合?还是一些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
Run Code Online (Sandbox Code Playgroud)
结果:
<class 'list'>
<class 'array.array'>
<class 'set'>
0.0012176036834716797
0.0024595260620117188
1.430511474609375e-06
Run Code Online (Sandbox Code Playgroud)
因此,对于成员资格检查,设置集要快得多(请注意科学计数法)。因此,如果它们的内存占用空间与阵列没什么不同,我将更喜欢使用一组。但是我不知道如何检查内存占用量。
我还应该补充一点,比较集合和列表有很多问题。但是我没有比较数组和集合的好答案。
如果您的情况可能的话,bisect性能接近于set成员资格检查(包括列表和数组)。查看下面的结果
import array
from bisect import bisect
import sys
import time
class TimerContext:
def __enter__(self):
self.t0 = time.time()
def __exit__(self, *args, **kwargs):
print(time.time() - self.t0)
def get_size_in_megabytes(iterable):
return round(sys.getsizeof(iterable) / (1024 ** 2), 2)
SIZE = 1000000
l = list([i for i in range(SIZE)])
a = array.array("I", l)
s = set(l)
print(type(l), get_size_in_megabytes(l))
print(type(a), get_size_in_megabytes(a))
print(type(s), get_size_in_megabytes(s))
with TimerContext():
x = 99999 in l
with TimerContext():
x = 99999 in a
with TimerContext():
x = 99999 in s
print("list bisect")
with TimerContext():
bisect(l, 99999)
print("array bisect")
with TimerContext():
bisect(a, 99999)
Run Code Online (Sandbox Code Playgroud)
结果:
<class 'list'> 8.58
<class 'array.array'> 3.81
<class 'set'> 32.0
0.0024390220642089844
0.0053005218505859375
3.814697265625e-06
list bisect
9.298324584960938e-06
array bisect
6.198883056640625e-06
Run Code Online (Sandbox Code Playgroud)
使用感谢sys.getsizeof@CristiFati。
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |