有个简单的测试,结果显示,在set面前,其他的都是浮云……………… 直接看代码和结果吧。 simple_filter 最原始的方式 use_dict_with_count ,使用列表中元素作为key, 这样自然会把重复元素去掉。 use_dict_without_count,与上面的一样,只不过这个版本不对重复元素进行计数 use_self_set,使用了set, 但是个蛋疼版本 directly_set, 直接使用set。 一百万个元素的列表,散布在 0 ~ 999 之间
import random
import timeit
from collections import defaultdict
a = [random.randint(0, 999) for i in xrange(1000000)]
def _timeit(func):
def wrap(*args, **kwargs):
t = timeit.Timer(
'%s()' % func.func_name, 'from __main__ import %s' % func.func_name
)
print func.func_name,
print min(t.repeat(number=1))
return wrap
def simple_filter():
b = []
for i in a:
if i not in b:
b.append(i)
return b
def use_dict_with_count():
d = defaultdict(lambda: 0)
for i in a:
d[i] += 1
return [num for num, count in d.iteritems()]
def use_dict_without_count():
d = defaultdict(lambda: 0)
for i in a:
d[i]
return [num for num, count in d.iteritems()]
def use_self_set():
s = set()
for i in a:
if i not in s:
s.add(i)
return list(s)
def directly_set():
return list(set(a))
if __name__ == '__main__':
_timeit(simple_filter)()
_timeit(use_dict_with_count)()
_timeit(use_dict_without_count)()
_timeit(use_self_set)()
_timeit(directly_set)()
看看结果:
simple_filter 11.5440781116
use_dict_with_count 0.250787973404
use_dict_without_count 0.106595039368
use_self_set 0.10227394104
directly_set 0.0693140029907