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指出的)和字节码的区别主要在于一个涉及属性查找和函数调用(包括参数解析)的事实

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

值得指出的是,如果您希望优化,这可能不是您应该关注的地方。此外,函数调用和方法查找的开销是完全多余的,如果设置的大小有点大,则无法检测到。

显然:)。谢谢,非常感谢:)。谢谢,修好了