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