有序列表和集合插入操作的耗時差距

lt發表於2020-01-11

有個需求,需要插入不重複的數,忽略重複的數。下面插入10000個數。
1.用集合

import bisect as bi
import time as tm
set_a=set()
sortlst_a=[]

def ins_set(n):
 for i in range(n,1,-2):
  set_a.add(i)
 return len(set_a)

2.用有序列表

def ins_lst(n):
 for i in range(n,1,-2):
  if bi.bisect_right(sortlst_a,i)==bi.bisect_left(sortlst_a,i):bi.insort(sortlst_a,i)
 return len(sortlst_a)

t=tm.time();set_a=set();print(ins_set(2*10**5),tm.time()-t)
t=tm.time();sortlst_a=[];print(ins_lst(2*10**5),tm.time()-t)

結果

>>> t=tm.time();set_a=set();print(ins_set(2*10**5),tm.time()-t)
100000 0.031199932098388672
>>> t=tm.time();sortlst_a=[];print(ins_lst(2*10**5),tm.time()-t)
100000 4.2900073528289795

差距有點大,不過,比起每次插入前,對列表sort然後append,bitsec還是算快的。

def ins_lst3(n):
 for i in range(n,1,-2):
  sortlst_a.sort()
  if bi.bisect_right(sortlst_a,i)==bi.bisect_left(sortlst_a,i):sortlst_a.append(i)
 return len(sortlst_a)

>>> t=tm.time();sortlst_a=[];print(ins_lst3(10**5),tm.time()-t)
50000 43.414876222610474

相關文章