pythonsumdigits

Sum the digits of a number


If I want to find the sum of the digits of a number, i.e.:

What is the fastest way of doing this?

I instinctively did:

sum(int(digit) for digit in str(number))

and I found this online:

sum(map(int, str(number)))

Which is best to use for speed, and are there any other methods which are even faster?


Solution

  • Both lines you posted are fine, but you can do it purely in integers, and it will be the most efficient:

    def sum_digits(n):
        s = 0
        while n:
            s += n % 10
            n //= 10
        return s
    

    or with divmod:

    def sum_digits2(n):
        s = 0
        while n:
            n, remainder = divmod(n, 10)
            s += remainder
        return s
    

    Slightly faster is using a single assignment statement:

    def sum_digits3(n):
       r = 0
       while n:
           r, n = r + n % 10, n // 10
       return r
    

    > %timeit sum_digits(n)
    1000000 loops, best of 3: 574 ns per loop
    
    > %timeit sum_digits2(n)
    1000000 loops, best of 3: 716 ns per loop
    
    > %timeit sum_digits3(n)
    1000000 loops, best of 3: 479 ns per loop
    
    > %timeit sum(map(int, str(n)))
    1000000 loops, best of 3: 1.42 us per loop
    
    > %timeit sum([int(digit) for digit in str(n)])
    100000 loops, best of 3: 1.52 us per loop
    
    > %timeit sum(int(digit) for digit in str(n))
    100000 loops, best of 3: 2.04 us per loop