zoukankan      html  css  js  c++  java
  • 列表原序去重性能测试

    对列表的去重很简单,set()一下再list()回来就可以了,但是如果要保留原始列表的顺序呢?

    举例,对["b", "b", "c", "a", "c", "b", "a", "b"]这个列表进行原序去重,得到结果应该是['b', 'c', 'a']

    有下面这几种写法:

    二次排序

    也就是对去重结果再按原列表sort一次:

    def sort_1(list_in):
        return sorted(list(set(list_in)), key=list_in.index)
    

    匿名函数

    使用匿名函数将列表里不重复的元素累加到一个新列表中:

    def sort_2(list_in):
        return reduce(lambda x, y: x if y in x else x + [y], [[], ] + list_in)
    

    借用字典

    有序字典

    使用OrderedDict排序:

    def sort_3(list_in):
        return list(collections.OrderedDict.fromkeys(list_in).keys())
    

    defaultdict

    类似的,我们使用defaultdict进行排序:

    def sort_4(list_in):
        return list(collections.defaultdict.fromkeys(list_in).keys())
    

    直接使用dict

    在python3.6之前, dictkey的顺序并不保证一定是插入顺序,所以只有在python3.6之后才可以直接用dict实现这个操作;

    def sort_5(list_in):
        return list(dict.fromkeys(list_in).keys())
    

    完整性能测试代码如下:

    # !/usr/bin/env python
    # encoding: utf-8
    
    from timeit import repeat
    from functools import reduce
    from collections import defaultdict, OrderedDict
    
    example = ["b", "b", "c", "a", "c", "b", "a", "b"]
    
    
    def sort_1(list_in):
        return sorted(list(set(list_in)), key=list_in.index)
    
    
    def sort_2(list_in):
        return reduce(lambda x, y: x if y in x else x + [y], [[], ] + list_in)
    
    
    def sort_3(list_in):
        return list(OrderedDict.fromkeys(list_in).keys())
    
    
    def sort_4(list_in):
        return list(defaultdict.fromkeys(list_in).keys())
    
    
    def sort_5(list_in):
        return list(dict.fromkeys(list_in).keys())
    
    
    if __name__ == '__main__':
        # time usage: t5< t4 < t3 < t2 < t1
        resul 大专栏  列表原序去重性能测试t = {}
        for i in range(1, 6):
            result['sort_{}'.format(i)] = repeat('sort_{}(example)'.format(i),
                                                 'from __main__ import sort_{}, example'.format(i),
                                                 number=1000000,
                                                 repeat=5)
        for k, v in result.items():
            avg_v = round(sum(v) / len(v), 3)
            print(k, avg_v)
    
    

    在我的苏菲婆上的结果仅供参考:

    排序 平均时间
    sort_1 1.477
    sort_2 1.305
    sort_3 0.957
    sort_4 0.734
    sort_5 0.698

    可见,python3.6之后dict是最好的原序去重办法,3.6之前用defaultdict吧。

    Avatar
    Lex Wayne
    Python Knight & Go Padawan

    You see, madness, as you know, is like gravity.

  • 相关阅读:
    Oct 21st-
    ContextLoaderListener 解析
    HTTPS 证书制作及使用
    Spring MVC 源码分析
    思考
    《深入理解java虚拟机》 第七章虚拟机类加载机制
    《深入理解java虚拟机》第六章 类文件结构
    《深入理解java虚拟机》第三章 垃圾收集器与内存分配策略
    《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常
    SSM-1第一章 认识SSM框架和Redis
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12366366.html
Copyright © 2011-2022 走看看