我想问一下
之间有什么区别# suppose s1, s2 is set in python
method1: >> s1 | s2
method2: >> s1.union(s2)
在Python3中
内存使用情况? 性能
答案 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
。
值得指出的是,如果您正在寻求优化,这可能不是您应该引起注意的地方。此外,函数调用&如果设置的大小有些大,则方法查找完全被取代并且无法检测到。