如何解决列表列表与元组集合的时间复杂度
我一直读到集合操作是 O(1),最坏的是 O(N),而检查列表成员资格是 O(N)。因此,当朋友在追加列表之前检查列表是否在列表中时,我建议改用一组元组。但是,在对它们计时后,列表列表会更快!为什么是这样?如何将元组添加到集合中比迭代列表列表慢?
这是一些示例测试代码
import time
a = []
b = []
for i in range(10000):
a.append(list(range(100)))
b.append(tuple(range(100)))
p=[]
tic=time.perf_counter()
for i in range(100):
if a[i] not in p:
p.append(a[i])
toc=time.perf_counter()
print(toc-tic) # Was about 100ms
q=set()
tic=time.perf_counter()
for i in range(100):
q.add(b[i])
toc=time.perf_counter()
print(toc-tic) # Was about 169ms
r=dict()
tic=time.perf_counter()
for i in range(100):
r[b[i]]=None
toc=time.perf_counter()
print(toc-tic) # Was about 143ms
解决方法
您没有很好地测试哪个更快,因为您只是在 p,q,r
中添加了一个元素,因为 a
仅由一个重复的元素组成:list(range(100)) ,b
也是如此。
一个更好的测试是这个修改后的版本,你会看到你所期望的,因为在这里你向 a
和 b
添加了不同的元素:
import time
a = []
b = []
for i in range(100000):
a.append(i)
b.append(i)
p=[]
tic=time.perf_counter()
for i in range(100):
if a[i] not in p:
p.append(a[i])
toc=time.perf_counter()
print(toc-tic)
q=set()
tic=time.perf_counter()
for i in range(100):
q.add(b[i])
toc=time.perf_counter()
print(toc-tic)
r=dict()
tic=time.perf_counter()
for i in range(100):
r[b[i]]=None
toc=time.perf_counter()
print(toc-tic)
,
好吧,没关系。原来这是由于列表的构造方式造成的:嵌套列表不是唯一的,因此检查列表是否在列表中本质上是 O(1),因为它始终是第一个列表。做这个轻微的修改让世界上的一切再次正确:
a = []
b=[]
m=100
n=100
for i in range(n):
a.append(list(range(i,i+m)))
b.append(tuple(range(i,i+m)))
p=[]
tic=time.perf_counter()
for i in range(n):
if a[i] not in p:
p.append(a[i])
toc=time.perf_counter()
print(toc-tic)
q=set()
tic=time.perf_counter()
for i in range(n):
q.add(b[i])
toc=time.perf_counter()
print(toc-tic)
r=dict()
tic=time.perf_counter()
for i in range(n):
r[b[i]]=None
toc=time.perf_counter()
print(toc-tic)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。