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 Literals完胜

    原理

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

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

    分析

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

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

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

    总结

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

  • 相关阅读:
    借书证信息管理系统,C语言实现
    以太坊 助记词提取 账户 公钥 私钥 最新实现可用。
    solc@0.6.3 web3@1.2.6 都是最新版本的,编译与部署示例
    ganache gas 错误
    MFC 记事本 文本编辑器
    课程设计 C语言 学生成绩管理系统
    cmake(.os .a)
    git recommend(alive)
    tensorflow tfrecoder read write
    300. 最长上升子序列
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/6139573.html
Copyright © 2011-2022 走看看