去除列表中重复元素,生成一个没有重复元素的新列表。几种方法效率对比

有个简单的测试,结果显示,在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

转载于:https://my.oschina.net/taisha/blog/57226

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值