Python 使用“是否更好?”;如果x在(y,z)中;超过;如果x==y或x==z";?
鉴于这一简单条件:Python 使用“是否更好?”;如果x在(y,z)中;超过;如果x==y或x==z";?,python,performance,python-3.x,if-statement,readability,Python,Performance,Python 3.x,If Statement,Readability,鉴于这一简单条件: if x == y or x == z: print("Hello World!"); 我知道Python会首先查看x是否等于y,如果x不等于y,然后检查x是否等于z,打印你好世界如果至少有一个条件为真 如果我要这样做: if x in (y, z): print("Hello World!"); 据我所知,Python将遍历“yz”元组,然后打印helloworld如果x的值在“yz”元组中 使用哪种方法更快/更有效? 如果x等于y,Python会不会费
if x == y or x == z:
print("Hello World!");
我知道Python会首先查看x
是否等于y
,如果x
不等于y
,然后检查x
是否等于z
,打印你好世界代码>如果至少有一个条件为真
如果我要这样做:
if x in (y, z):
print("Hello World!");
据我所知,Python将遍历“yz”元组,然后打印helloworld
如果x
的值在“yz”元组中
使用哪种方法更快/更有效?
如果x
等于y
,Python会不会费心检查x
是否等于z
如果x
等于y
,但不是z
,Python还会执行if语句中的代码吗
提前谢谢。如果x==y或x==z,我会选择:
您可以利用这样一个事实:如果x==y
,则不会对x==z
进行计算
创建匿名临时元组可能会带来开销
如果x==y或x==z在其他语言中也很常见,因此可能更具可读性
也许一个好的python解释器可以优化匿名临时语句。我知道python是一种懒惰的语言,如果不需要的话,他不会检查第二条语句。但我不知道你的其他方法是否会更快
如果x等于y,Python不会费心检查x是否等于z吗
是的,Python不会检查它
如果x等于y而不是z,Python还会执行if语句中的代码吗
不,他不会的。对于两种选择,第一种更具可读性,对于二十种,第二种。性能不是真正的问题。让我们自己测试一下
下面是一个重载相等运算符的类,让我们看看Python在做什么:
class Foo:
def __init__(self, name):
self.name = name
def __eq__(self, other):
print self.name, "==", other.name, "?"
return self.name == other.name
让我们测试一下短路:
# x and a are passed the same string because we want x == a to be True
x = Foo("a")
a, b = Foo("a"), Foo("b")
if x in (a, b):
print "Hello World!"
对我来说,这将产生:
a == a ?
Hello World!
a==b?
未打印,因此短路可以按需要工作。该块也根据需要执行
现在谈谈速度。如果我们修改上述\uuu eq\uuu
方法以删除打印语句(以避免基准测试中的I/O),并使用IPython的%timeit
魔术命令,我们可以这样测试它:
c = Foo("c") # for comparison when x is not equal to either case
%timeit x in (a, b) # equal to first case
%timeit (x == a or x == b)
%timeit x in (b, a) # equal to second case
%timeit (x == b or x == a)
%timeit x in (b, c) # not equal to either case
%timeit (x == b or x == c)
这些是每次迭代的平均次数(从100万次迭代开始):
所以,结果相当相似。虽然有点不同,但还不足以让人担心。只需根据具体情况使用可读性最好的选项。当只有两个选项时,这实际上只是基于意见,尽管我想指出,如果您需要对照5个值检查x
,则会有更大的差异:
if x == a or x == b or x == c or x == d or x == e:
vs:
特别是如果您以后需要将其更改为不在中,而将所有==
更改为=代码>第二个问题似乎更容易展开。对于第一个问题,您始终可以进行基准测试。第二个问题我不太清楚。你可以测试第三个问题。这是关于效率的讨论。集合在{y,z}
中也是一个选项。我无法想象它会有什么真正的区别。如果是的话,你可能应该用C。当在(y,z)中检查x时,
它只会检查x==z
如果x不等于y,那么你的第一点就不是什么大问题了。谢谢你的回答,谢谢你的回答。x,y,z=x(“x”),
x(“z”)
x(“z”)
你可能想做中间的x(“y”)
?@tadhgmdonald Jensen否,因为我希望等式运算符在这种情况下计算为True
。可能类名和字符串值有点混淆。现在我将添加一条注释来解释它。如果它们不直接表示变量名,我将使用a
和b
作为字符串,因为是的这真的很让人困惑。另外告诉我,你在计时之前删除了\uuuu eq\uuuu
中的print语句了吗?@tadhgmald Jensen我同意。我会将字符串值更新为这些值。谢谢。是的,我删除了print语句(我在%timeit
命令之前提到了它)。谢谢你的回答和测试,谢谢:)Python本身不是一种懒惰的语言和
和
或
被定义为短路运算符,仅在需要定义整个表达式时才计算第二个参数。是的,这就是我想说的谢谢你的回答,谢谢。谢谢你的回答,谢谢。亲爱的佩里,正如Alex Bowe之前的回答所示,第二句话很准确。因此第一句话就足够了。谢谢你的回答,谢谢。
if x == a or x == b or x == c or x == d or x == e:
if x in (a,b,c,d,e):