Различие скорости суммы цифр через строку и через алгоритм

Можете объяснить, почему возникает такая огромная разница в скорости вычисления этих двух функций? Мне казалось, что и строки, и числа реализованы на С, но неужели из-за того что они безразмерные настолько дольше получается или в чем разница?

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 шт):

Автор решения: Harry

Дело в том, что длинная арифметика - крайне сложное и затратное дело, особенно деление. Так что там, где способ со строками тратит время только на вычисление и создание строки, а далее идет простейшее суммирование малых чисел, выбираемых из строки по сути мгновенно, второй способ для получения очередной цифры проводит массу вычислений с очень большими числами...

В то время как все эти промежуточные вычисления по сути не нужны и при работе со строкой не выполняются.

→ Ссылка