Python 3.x python集上运算符和方法的区别
我想问一下两者之间的区别是什么Python 3.x python集上运算符和方法的区别,python-3.x,set,Python 3.x,Set,我想问一下两者之间的区别是什么 # suppose s1, s2 is set in python method1: >> s1 | s2 method2: >> s1.union(s2) 在蟒蛇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
# suppose s1, s2 is set in python
method1: >> s1 | s2
method2: >> s1.union(s2)
在蟒蛇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
>>>
从中我们可以看出,这两种形式在功能上是等价的。不同之处在于,第二种情况涉及属性查找和函数调用,与简单的字节码指令调用相比,这在解释器中具有更高的开销
>>> 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
让我们分析一下字节码
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中,(由set1.union(set2)
调用)和(由set1 | | set2
调用),这两个最终执行操作的函数实际上是相似的
区别(正如Lukasz指出的)和字节码的区别主要在于一个涉及属性查找和函数调用(包括参数解析)的事实
在内存/复杂性方面,它们是相似的,它们最终都会调用
值得指出的是,如果您希望优化,这可能不是您应该关注的地方。此外,如果设置的大小有点大,则函数调用和方法查找的开销是完全多余的,无法检测到。这两个操作的执行方式完全相同
| |
只不过是对set.union
的一种方便
在CPython中,(由set1.union(set2)
调用)和(由set1 | | set2
调用),这两个最终执行操作的函数实际上是相似的
区别(正如Lukasz指出的)和字节码的区别主要在于一个涉及属性查找和函数调用(包括参数解析)的事实
在内存/复杂性方面,它们是相似的,它们最终都会调用
值得指出的是,如果您希望优化,这可能不是您应该关注的地方。此外,函数调用和方法查找的开销是完全多余的,如果设置的大小有点大,则无法检测到。显然:)。谢谢,非常感谢:)。谢谢,修好了