Я решал задачу 26 в Project Euler, где мне нужно вычислить длину повторяющейся части 1 / n, где n - все целые числа от 1 до 1000, и посмотреть, какое число составляет самую длинную повторяющуюся часть. Это означало, что мне нужно, чтобы мое деление было сделано более точно. Поэтому я играл с моей десятичной точностью, меняя getContext().prec
, но затем каким-то образом увеличивая точность, программа стала намного быстрее. Я запустил эту программу, используя Python 3.7. Вот код:
import re
import time
s = time.time()
from decimal import *
getcontext().prec = 500 #This part
recurring = 0
answer = 0
p = re.compile(r"([0-9]+?)\1{3,}")
for i in range(1, 1000):
f = p.search(str(Decimal(1) / Decimal(i))[5:])
if f:
number = f.group(1)
if len(str(number)) > len(str(recurring)):
recurring = number
answer = i
print(answer)
print(time.time() - s)
Это был результат, когда я использовал точность 500:
>>> print(answer)
349
>>> print(time.time() - s)
2.923844575881958
... и вот что я получил, когда использовал точность 5000:
>>> print(answer)
983
>>> print(time.time() - s)
0.07812714576721191
Я поменял 500 на 5000, и он не только дал мне правильный ответ, поскольку повторяющаяся часть 1 / answer была, вероятно, длиннее, чем 500, но и намного быстрее. Я пробовал это с онлайн-переводчиком Python, и это также дало мне похожий результат. Почему это так?