[Tutor] back on bytes

Kent Johnson kent37 at tds.net
Sat Jul 7 13:51:27 CEST 2007


Alan Gauld wrote:
> Surely it is easier and more obvious
> to simply shift the bits right or left using >> and << and use
> bitwise and/or operations than do all this multiplication and
> addition malarky. (Its also a lot faster!)

Are you sure about that? With Python  2.5 on a MacBook Pro it seems to 
be *slightly* faster:

src $ python -m timeit "5 << 21; 10 << 21; 50 << 21; 247 << 21"
10000000 loops, best of 3: 0.0917 usec per loop

src $ python -m timeit "5 * 0x200000; 10 * 0x200000; 50 * 0x200000; 247 
* 0x200000"
10000000 loops, best of 3: 0.0924 usec per loop

.0917/.0924 = 0.99242424242424254

src $ python -m timeit -s "nums=range(256); mults=range(1, 22)" "for i 
in nums:" "  for m in mults:" "    i<<m"
1000 loops, best of 3: 564 usec per loop

src $ python -m timeit -s "nums=range(256); mults=[1<<m for m in 
range(1, 22)]" "for i in nums:" "  for m in mults:" "    i*m"
1000 loops, best of 3: 579 usec per loop

src $ python -m timeit -s "nums=range(256); mults=[1<<m for m in 
range(1, 22)]" "for i in nums:" "  for m in mults:" "    pass"
10000 loops, best of 3: 195 usec per loop

If the last timing is a reasonable estimate of the loop overhead in the 
previous two, then roughly the speed difference is 579-195=384 vs 
564-195=369 and shifting is 369/384.=0.9609375 the speed of multiplication.

My guess is the integer multiply in my computer recognizes this simple 
case and optimizes it to a shift.

Kent


More information about the Tutor mailing list