python in 操作耗时测试和性能分析
这里主要是对于序列:list set 进行测试,其中用到的是timeit 计时,采用随机样本进行序列的构造。
测试代码:
# coding=utf8 __author__ = 'lfc' import timeit import random seq_len = 4 # 10 ** 4 x = random.sample([i for i in range(10 ** 6)], 10 ** seq_len) y = set(x) z = sorted(x) n = 320170 c = 1000 def fx(): return n in x def fy(): return n in y def fz(): return n in z def fn(): return set(x) def fs(): return sorted(x) print "预处理操作 %d 次用时:" % c print "set it:%.24f" % timeit.timeit(fn, number=c) print "sorted it:%.24f" % timeit.timeit(fs, number=c) print "" print "in 操作 %d 次用时:" % c print "list: %.24f" % timeit.timeit(fx, number=c) print "set: %.24f" % timeit.timeit(fy, number=c) print "sorted list: %.24f" % timeit.timeit(fz, number=c)
分析:
结论: 对set 进行 in 判断 ,与序列长度无关
对于list 进行 in 操作, 耗费时间与随长度增加而增加与N相关
对于排过序的in 操作时间与序列长度N线性相关, 并且排序的时间最好也是log n
并且 ,在将list 转化为 list 时所耗费时间却是更长,
所以具体选用的方式:
对于已经有的数据结果,如果是单次in操作, 则直接进行 ,
如果需要多次进行in操作,且次数大于3(此处是以测试为例)倍 list 长度, 建议提前将其转化为set,再次进行in 操作