我有这段代码:
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)
确定一种实现是否比另一种实现更快(或更慢)的最佳方法是计时。
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%