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的方式

  • 相关阅读:
    webapi之fiddler头设置
    ios---setContentOffset
    webapi参数处理get过个参数
    socket网络编程
    logging模块
    configparser模块(拷贝)
    hashlib模块--摘要算法
    异常处理
    面向对象拓展
    反射
  • 原文地址:https://www.cnblogs.com/dancesir/p/10861779.html
Copyright © 2011-2022 走看看