在Python中,哪一种比较数字的方法更好?为什么?

在Python中,哪一种比较数字的方法更好?为什么?,python,python-3.x,Python,Python 3.x,因此,如果我想比较Python中的数字,比如说,检查数字是否在2到100的范围内。 以下哪种方法最可取?为什么 使用比较运算符 if(n>=2 and n<=100): print("Okay") 如果比较非常大的数字,您的答案也会改变吗?在这种情况下,python方法将使用: 在这种情况下,python的方法是使用: 差别很小,但这里有一些比较,我会把它放在评论中,但太冗长了: n = 999_999_999 %%timeit -n 100000 if 2 <=

因此,如果我想比较Python中的数字,比如说,检查数字是否在2到100的范围内。 以下哪种方法最可取?为什么

使用比较运算符

if(n>=2 and n<=100):
    print("Okay")

如果比较非常大的数字,您的答案也会改变吗?

在这种情况下,python方法将使用:


在这种情况下,python的方法是使用:


差别很小,但这里有一些比较,我会把它放在评论中,但太冗长了:

n = 999_999_999

%%timeit -n 100000
if 2 <= n <= 1_000_000_000:
    pass
# 85.8 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit -n 100000
if 2 <= n and n <= 1_000_000_000:
    pass
# 81.3 ns ± 15.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit -n 100000
if n in range(1_000_000_000):
    pass
# 360 ns ± 29.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

差别很小,但这里有一些比较,我会把它放在评论中,但太冗长了:

n = 999_999_999

%%timeit -n 100000
if 2 <= n <= 1_000_000_000:
    pass
# 85.8 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit -n 100000
if 2 <= n and n <= 1_000_000_000:
    pass
# 81.3 ns ± 15.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit -n 100000
if n in range(1_000_000_000):
    pass
# 360 ns ± 29.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

第一个更好,第二个更慢,更大的数字,不适用于浮动。@MichaelButscher速度差应该相对较小,无论数字有多大。Python必须分配范围对象是all。我确信它的uu contains uuu方法基本上就是这个双重不等式。@MichaelButscher范围对象不是列表。不管它有多少元素。请参见Scott,Selcuk,对,我真的忘记了在找到/没有找到数字之前它不必处理迭代器。@Alexander实际上和变量的性能稍高一些:。不过,我同意可读性。第一个更好,第二个更慢,对于大的数字来说更慢,并且对浮点数不起作用。@MichaelButscher速度差应该相对较小,无论数字有多大。Python必须分配范围对象是all。我确信它的uu contains uuu方法基本上就是这个双重不等式。@MichaelButscher范围对象不是列表。不管它有多少元素。请参见Scott,Selcuk,对,我真的忘记了在找到/没有找到数字之前它不必处理迭代器。@Alexander实际上和变量的性能稍高一些:。不过我同意可读性,我的问题不是可读性或编写比较运算符的方法。我更感兴趣的是了解比较运算符v/s范围对性能的影响function@SumaiyaA性能影响几乎可以忽略不计,是什么阻止了您自己对其进行计时?然而,一个很大的区别是,range不支持对非int对象进行有效的包含检查,所以从算法上来说,浮点运算会慢得多。我的问题不是可读性或编写比较运算符的方法。我更感兴趣的是了解比较运算符v/s范围对性能的影响function@SumaiyaA性能影响几乎可以忽略不计,是什么阻止了您自己对其进行计时?但是,一个很大的区别是,range不支持对非int对象进行有效的包含检查,因此从算法上讲,浮点运算速度会慢得多。请注意,尝试使用n=9999999.0如果n是浮点运算,则比较速度明显会慢,但在问题的上下文中没有意义,即如果n在Range2101中。否,使用非int的对象将绕过快速成员资格测试,并简单地在range对象上迭代。注意,对范围对象使用int对象进行的成员资格测试是常数时间,但对任何其他类型的对象来说都是线性时间,这是一个很好的观点,但我不在问题的范围之内,因为n是针对一个整数范围进行测试的。注意,尝试使用n=99999999.0如果n是一个浮点数,它显然会减慢比较速度,但在问题的上下文中没有意义,即如果在Range2101中使用ifn。不,使用一个不是int的对象将绕过快速成员资格测试,只需在range对象上迭代。注意,对范围对象使用int对象进行成员资格测试是常数时间,但对任何其他类型的对象来说都是线性时间,这是一个很好的观点,但我不在问题的范围之内,因为n是针对一个整数范围进行测试的,因此n被推断为整数。
n = 999_999_999

%%timeit -n 100000
if 2 <= n <= 1_000_000_000:
    pass
# 85.8 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit -n 100000
if 2 <= n and n <= 1_000_000_000:
    pass
# 81.3 ns ± 15.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit -n 100000
if n in range(1_000_000_000):
    pass
# 360 ns ± 29.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)