Код: Выделить всё
math.sqrt(x)Поскольку второй из этих методов не требует явного вызова функции, можно ожидать, что он будет быстрее, чем первый метод. Однако, похоже, это не так.
Вот тестовый код:
Код: Выделить всё
"""
Performance comparison between math.sqrt and n ** 0.5
"""
from random import uniform
from math import sqrt
from timeit import timeit
from collections.abc import Iterator
LOOP = 10
URANGE = (0.0, 100.0)
def func1(x: float) -> float:
"""
Calculate square root using math.sqrt function
"""
return sqrt(x)
def func2(x: float) -> float:
"""
Calculate square root using exponential form
"""
return x**0.5
def pdiff(v1: float, v2: float) -> float:
"""
Calculate the percentage difference between two values
"""
return (v1 - v2) / ((v1 + v2) / 2) * 100.0
def rn() -> Iterator[float]:
"""
Generate LOOP pseudo-random numbers
"""
for _ in range(LOOP):
yield uniform(*URANGE)
if __name__ == "__main__":
N = 5_000_000
dt = [[], []]
for ux in rn():
for a, func in zip(dt, (func1, func2)):
a.append(timeit(lambda: func(ux), number=N))
print(func.__name__, f"{a[-1]:.4f}s")
print()
p = pdiff(*map(sum, dt))
print(f"{p:.2f}%")
Может ли кто-нибудь объяснить, почему это так?
Подробнее здесь: https://stackoverflow.com/questions/798 ... us-reality
Мобильная версия