Прежде всего, я запрограммировал три простые функции, вычисляющие это суммирование более наивным способом:
Код: Выделить всё
def basic(n):
s = 0
for i in range(1, n + 1):
s += 1 / i
return s - math.log(n) - 0.577215664901532861
Код: Выделить всё
def with_sum(n):
s = sum(1 / i for i in range(1, n + 1))
return s - math.log(n) - 0.577215664901532861
Код: Выделить всё
def with_numpy_sum(n):
s = np.sum(1 / i for i in range(1, n + 1))
return s - math.log(n) - 0.577215664901532861
Но, к моему удивлению, у меня получились следующие таймеры:
Код: Выделить всё
>>> N = 100000000
>>> timeit basic(N)
4.91 s ± 263 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> timeit with_sum(N)
5.61 s ± 360 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> timeit with_numpy_sum(N)
7.83 s ± 210 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Кто-нибудь может это объяснить?Я видел аналогичный вопрос, но я не могу вычислить 1/i без цикла for...
Подробнее здесь: https://stackoverflow.com/questions/790 ... m-function