为什么在if语句中使用变量比魔术数字快?

Hug*_*ley 0 python

查看一些Leetcode问题,看到下面的求逆整数的解决方案

def reverse(self, x: int) -> int:
    maxint = 2147483649
    minint = -2147483648
    ans = int(str(abs(x))[::-1])
    return ans * (abs(x)//x) if minint < ans < maxint and ans else 0
Run Code Online (Sandbox Code Playgroud)

以为我可以通过替换变量minintmaxint使用值来显着提高速度。

def reverse(self, x: int) -> int:
    ans = int(str(abs(x))[::-1])
    return ans * (abs(x)//x) if -2147483648 < ans < 2147483649 and ans else 0
Run Code Online (Sandbox Code Playgroud)

(这个问题有点奇怪,因为它要求假设只有32位分配给一个整数,应该对它进行错误处理,而不是事后进行此奇怪的“检查”?)

第二个代码块在40毫秒内运行测试,而第一个代码块在28毫秒内运行。

为什么将变量用于if而不是值更快?

Jul*_*ien 5

用于timeit进行适当的性能测试。您的版本比预期的稍快(尽管在错误栏中):

def f(x: int) -> int:
    maxint = 2147483649
    minint = -2147483648
    ans = int(str(abs(x))[::-1])
    return ans * (abs(x)//x) if minint < ans < maxint and ans else 0

def g(x: int) -> int:
    ans = int(str(abs(x))[::-1])
    return ans * (abs(x)//x) if -2147483648 < ans < 2147483649 and ans else 0

%timeit f(123456789)
#710 ns ± 16.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit g(123456789)
#700 ns ± 8.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Run Code Online (Sandbox Code Playgroud)

请注意,这种“优化”是无关紧要的,特别是因为它还可以降低代码的可读性。