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