zoukankan      html  css  js  c++  java
  • Python Set Literals

    现有3种方式创建set()

    >>> def f():
    ...     return set([1, 2, 3])
    ... 
    >>> def h():
    ...     return set((1, 2, 3))
    ... 
    >>> def g():  #set Literals
    ...     return {1, 2, 3}
    
    >>> f()
    set([1, 2, 3])
    >>> h()
    set([1, 2, 3])
    >>> g()
    set([1, 2, 3])

    效率对比

    >>> import timeit
    >>> min(timeit.repeat(f))
    0.675529956817627
    >>> min(timeit.repeat(h))
    0.5531120300292969
    >>> min(timeit.repeat(g))
    0.35515809059143066

    原理

    为了了解其中的原因,分析下生成set()的原理

    >>> dis.dis(f)
              0 LOAD_GLOBAL              0 (set)
    LOAD_CONST               1 (1)
    LOAD_CONST               2 (2)
    LOAD_CONST               3 (3)
    BUILD_LIST               3
    CALL_FUNCTION            1
    RETURN_VALUE        
    >>> dis.dis(h)
              0 LOAD_GLOBAL              0 (set)
    LOAD_CONST               4 ((1, 2, 3))
    CALL_FUNCTION            1
    RETURN_VALUE        
    >>> dis.dis(g)
              0 LOAD_CONST               1 (1)
    LOAD_CONST               2 (2)
    LOAD_CONST               3 (3)
    BUILD_SET                3
    RETURN_VALUE

    分析

    f()需要载入全局函数set,把三个元素放入栈中,然后调用set()函数,就生成了set()

    h()也需要载入全局函数set,不是把三个元素载入栈,而是把一个元组常量放入栈,然后调用set()函数,就生成了set()

    g()是直接把三个元素放入栈,然后就生成了set()

    总结

    尽管这里生成set()的方式对性能的提升很小,set literals不用花费时间调用函数处理中间数据,并且这种写法是非常漂亮的,所以建议用set literals的方式

  • 相关阅读:
    C- c常见问题分析
    LEETCODE
    MPI之求和
    在VS2010配置MPI--win7下64位系统
    OpenMP之枚举排序
    OpenMP之数值积分(求圆周率Pi)(sections)
    OpenMP之求和(用section分块完成)
    64位WIN7下安装MPICH2
    Ubuntu下eclipse开发hadoop应用程序环境配置
    C语言字符串函数例子程序大全 – string相关
  • 原文地址:https://www.cnblogs.com/dancesir/p/10861779.html
Copyright © 2011-2022 走看看