pythoncomputer-science

Why is large integer division faster than slicing (numeric) strings, for accessing individual digits?


I am doing a (typical) assignment of finding primes. I thought I'd be clever and, for large numbers, skip the division process with this trick:

def div5(candidate):
    return str(candidate)[-1] == "5"

Adding 5 to itself a few thousand times seems like a waste (I only need the last member), but I wanted to be sure.

credit to unutbu on Measure time elapsed in Python?

%>python -mtimeit -s"import intDiv" "intDiv.div5(2147483645)"
1000000 loops, best of 3: 0.272 usec per loop

%>python -mtimeit -s"import strDiv" "strDiv.str5(2147483645)"
1000000 loops, best of 3: 0.582 usec per loop

For clarification, here are the two methods I defined.

def div5(maxi): return not (maxi%5)

def str5(maxi): return str(maxi)[-1] == '5'

This is too slow. How can I analyze the last member of str(maxi), without converting the whole number (needlessly)?

Thanks to @Claudiu for help with cleaning up the eyesores.


Solution

  • % python -mtimeit "str(2147483645)"
    1000000 loops, best of 3: 0.321 usec per loop
    
    % python -mtimeit "2147483645 % 5"
    10000000 loops, best of 3: 0.0351 usec per loop
    
    % python -mtimeit "'2147483645'[-1]"
    10000000 loops, best of 3: 0.0349 usec per loop
    

    I'd say the bottleneck is converting to a string.