我想编写一个函数,它将整数x
,y
,L
和R
作为参数,并返回True
if {{1 }}否则位于区间x**y
和(L, R]
。
我正在考虑在这个函数中编写条件语句的几种方法:
False
if L < x ** y <= R:
if x ** y > L and x ** y <= R:
为什么选项1在执行时间方面效率最高?
答案 0 :(得分:5)
#1和#3都避免重新计算x ** y
,其中#2必须计算两次。
在Python 2上,#3会很糟糕,因为它必须计算range
的全部内容。在Python 3.2+上,它不是必须的(range
是智能的,并且可以在数学上正确地确定int
是否出现在range
中而不实际迭代,在恒定时间内) ,但它最多等同于#1,因为创建range
对象有一些开销。
在评论中提及tobias_k
,如果x ** y
生成float
,则#3会更慢(打破Python 3.2+ O(1)
成员资格测试优化,需要对所有值进行隐式循环),如果该值不等于int
中的任何range
值,则会得到与#1和#2不同的结果。也就是说,测试3.5 in range(1, 5)
会返回False
,并且必须针对3.5
,1
,2
和3
检查4
它甚至可以告诉你那么多。
基本上,坚持#1,它将是唯一一个避免冗余计算并避免在Py 2和Py3上创建大量值进行比较的人。 #3在Python 3.2+上不会太多(如果有的话)慢,但它确实涉及创建一个在这里不需要的range
对象,并且在逻辑上不太相同
答案 1 :(得分:1)
第一个必须仅评估x**y
一次,因此它应该比第二个更快(也更可读)。第三个必须遍历迭代器(在python 2中,因此它应该比两者慢)或进行两次比较(在python 3中,所以它并不比第一个更好)。保留第一个。