Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用元组而不是布尔运算符_Python_Tuples_Boolean Operations - Fatal编程技术网

Python 使用元组而不是布尔运算符

Python 使用元组而不是布尔运算符,python,tuples,boolean-operations,Python,Tuples,Boolean Operations,以下评估由和链接的两个(或多个)条件的方法之间是否存在差异(在性能方面,而不是可读性方面) a == 1 and b == 2 或 与或相同: a == 1 or b == 1 或 哪条路比较好?一个使用布尔运算符还是另一个使用元组?是的,逻辑上的区别在于使用和/或是短路 >>> def return1(): ... return 1 ... >>> def raises(): ... raise Exception('uh oh')

以下评估由
链接的两个(或多个)条件的方法之间是否存在差异(在性能方面,而不是可读性方面)

a == 1 and b == 2


相同:

a == 1 or b == 1



哪条路比较好?一个使用布尔运算符还是另一个使用元组?

是的,逻辑上的区别在于使用
/
是短路

>>> def return1():
...     return 1
... 
>>> def raises():
...     raise Exception('uh oh')
... 
>>> a, b = 1, 2
>>> a == return1() or b == raises()
True
>>> b == return1() and a == raises()
False
请注意,引发异常的函数从未被调用。在其他两个示例中,我们将有一个未处理的异常:

>>> a, b == return1(), raises()
# raises Exception
>>> 1 in (return1(), raises())
# raises Exception .. 

对于文本,这显然不会对流产生任何影响,任何性能差异都可能可以忽略不计。在这种情况下,我更喜欢第二种样式。

这些是使用python 2.7进行的一些计时

In [29]: a = 1 

In [30]: b = 2

In [31]: timeit a == 1 and b == 2
10000000 loops, best of 3: 82.2 ns per loop

In [32]: timeit (a,b) == (1,2)
10000000 loops, best of 3: 132 ns per loop

In [33]: timeit 1 in (a,b)
10000000 loops, best of 3: 118 ns per loop
如果结果是错误的:

In [37]: timeit a == 2 and b == 2
10000000 loops, best of 3: 52.2 ns per loop

In [38]: timeit 3 in (a,b)
10000000 loops, best of 3: 151 ns per loop

In [39]: timeit (a,b) == (2,2)
10000000 loops, best of 3: 144 ns per loop
a==2和b==2
的速度比
的速度快

根据wim的评论,使用集合将比检查元组成员身份更快:

In [55]: timeit 3 in {a,b}
10000000 loops, best of 3: 92.9 ns per loop

使用和/或运算符几乎总是在性能方面更好(可能不是为了可读性,但这是另一个问题): 1.它们避免了像您在其他示例中所做的那样创建元组对象,这在空间/时间复杂度方面会更加昂贵
2.它们会短路,这意味着您很有可能避免执行不必要的代码部分。

如果在{a,b}
中使用像
3这样的集合文字,您可能会看到比使用tupleGood点来比较函数的返回值更好的性能!谢谢
In [37]: timeit a == 2 and b == 2
10000000 loops, best of 3: 52.2 ns per loop

In [38]: timeit 3 in (a,b)
10000000 loops, best of 3: 151 ns per loop

In [39]: timeit (a,b) == (2,2)
10000000 loops, best of 3: 144 ns per loop
In [55]: timeit 3 in {a,b}
10000000 loops, best of 3: 92.9 ns per loop