如果我计算函数参数并将它们存储在变量中,这个 Python 代码会更快吗?

问题描述 投票:0回答:1

我有这段代码:

    def foo(n:int, p:int):
      return range(n**2, p+2, n*2)

python 是在“每次迭代”中计算 n**2、p+2、n*2 的值还是仅计算一次?

也就是说,这个功能是不是更快了?

    def foo_2(n: int, p:int):
        start = n**2 
        stop = p+2
        jump = n* 2
        return range(start, stop, jump)
python performance range
1个回答
0
投票

确定一种实现是否比另一种实现更快(或更慢)的最佳方法是计时。

timeit 模块非常适合此目的。

from timeit import timeit

# calculate the percentage difference between two values
def pdiff(x: float, y: float) -> float:
    return abs(x - y) / ((x + y) / 2) * 100

def foo_1(n: int, p: int) -> range:
    return range(n**2, p + 2, n * 2)


def foo_2(n: int, p: int) -> range:
    start = n**2
    stop = p + 2
    jump = n * 2
    return range(start, stop, jump)

x = y = 0.0

for func in foo_1, foo_2:
    duration = timeit(lambda: func(10, 1_000), number=5_000_000)
    y, x = duration, y
    print(func.__name__, f"{duration:.4f}s")

print(f"{pdiff(x, y):.2f}%")

M2 上的 Python 3.12.3 显示 foo_2 比 foo_1 慢约 5%。

正如@tripleee 所指出的那样,它速度较慢这一事实并不令人意外,但是,差异的大小却有点令人惊讶。

示例输出:

foo_1 0.4116s
foo_2 0.4317s
4.77%
© www.soinside.com 2019 - 2024. All rights reserved.