python集上运算符和方法的区别

时间:2016-10-27 08:08:39

标签: python-3.x set

我想问一下

之间有什么区别
# suppose s1, s2 is set in python
method1: >> s1 | s2
method2: >> s1.union(s2)

在Python3中

内存使用情况? 性能

2 个答案:

答案 0 :(得分:3)

让我们分析一下字节码。

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> dis.dis("s1 | s2")
  1           0 LOAD_NAME                0 (s1)
              3 LOAD_NAME                1 (s2)
              6 BINARY_OR
              7 RETURN_VALUE
>>> dis.dis("s1.union(s2)")
  1           0 LOAD_NAME                0 (s1)
              3 LOAD_ATTR                1 (union)
              6 LOAD_NAME                2 (s2)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 RETURN_VALUE
>>>

docs我们可以看到这两种形式在功能上是等价的。不同之处在于第二种情况涉及属性查找和函数调用,与简单的字节代码指令调用相比,它在解释器中具有更高的开销。

>>> import timeit
>>> timeit.timeit("s1 | s2", setup="s1=set(); s2=set()", number=1000000)
0.11251183700440137
>>> timeit.timeit("s1.union(s2)", setup="s1=set(); s2=set()", number=1000000)
0.19270662899877777

答案 1 :(得分:1)

预计两种操作都以完全相同的方式执行; ||只是方便set.union

在CPython中,set_union(由set1.union(set2)调用)和set_or(由set1 || set2调用)这些函数最终执行操作,实际上是类似。

差异(如Lukasz指出的那样)和字节码显示)主要是因为一个涉及属性查找和函数调用(需要进行参数解析)。

内存/复杂性它们是相似的,它们最终都会调用set_update_internal

值得指出的是,如果您正在寻求优化,这可能不是您应该引起注意的地方。此外,函数调用&如果设置的大小有些大,则方法查找完全被取代并且无法检测到。