Различие скорости суммы цифр через строку и через алгоритм
Можете объяснить, почему возникает такая огромная разница в скорости вычисления этих двух функций? Мне казалось, что и строки, и числа реализованы на С, но неужели из-за того что они безразмерные настолько дольше получается или в чем разница?
def sum_str(x):
cnt = 0
for digit in str(x):
cnt += int(digit)
return cnt
def sum_digits(x):
cnt = 0
while x > 0:
cnt += x % 10
x //= 10
return cnt
>>> number = random.randrange(10**10**5)
>>> %%time sum_str(number) # 700 ms~
>>> %%time sum_digits(number) # 13.8s~
Ответы (1 шт):
Дело в том, что длинная арифметика - крайне сложное и затратное дело, особенно деление. Так что там, где способ со строками тратит время только на вычисление и создание строки, а далее идет простейшее суммирование малых чисел, выбираемых из строки по сути мгновенно, второй способ для получения очередной цифры проводит массу вычислений с очень большими числами...
В то время как все эти промежуточные вычисления по сути не нужны и при работе со строкой не выполняются.