python集合上的操作符和方法的区别



我想问的是

# suppose s1, s2 is set in python
method1: >> s1 | s2
method2: >> s1.union(s2)
在Python3

内存使用情况?性能?

让我们分析一下字节码。

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
>>>

从文档中我们可以看到这两种表单在功能上是等同的。不同的是,第二种情况涉及属性查找和函数调用,与简单的字节码指令调用相比,这在解释器中有更高的开销。

>>> 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

两个操作应该以完全相同的方式执行;||只是相对于set.union的一种便利。

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

区别(正如Lukasz指出的)和字节码所显示的)主要在于一个涉及属性查找和函数调用(涉及参数解析)。

内存/复杂度方面它们是相似的,它们最后都调用set_update_internal

值得指出的是,如果你想要优化,这可能不是你应该关注的地方。此外,函数调用&如果集合的大小有点大,方法查找将完全被忽略,并且无法检测到。

最新更新