multiply each element of a list by a number

Colin J. Williams cjw at ncf.ca
Sun Dec 28 18:26:38 EST 2008


skip at pobox.com wrote:
>     Colin> ... perhaps faster than numpy:
>     ...
> 
> For extremely short lists, but not for much else:
> 
>     % for n in 1 10 100 1000 10000 100000 ; do
>     >   echo "len:" $n
>     >   echo -n "numpy: "
>     >   python -m timeit -s 'import numpy ; a = numpy.array(range('$n'))' 'a*3'
>     >   echo -n "list: "
>     >   python -m timeit -s 'a = range('$n')' '[3*x for x in a]'
>     > done
>     len: 1
>     numpy: 100000 loops, best of 3: 11.7 usec per loop
>     list: 1000000 loops, best of 3: 0.698 usec per loop
>     len: 10
>     numpy: 100000 loops, best of 3: 11.7 usec per loop
>     list: 100000 loops, best of 3: 2.94 usec per loop
>     len: 100
>     numpy: 100000 loops, best of 3: 12.1 usec per loop
>     list: 10000 loops, best of 3: 24.4 usec per loop
>     len: 1000
>     numpy: 100000 loops, best of 3: 15 usec per loop
>     list: 1000 loops, best of 3: 224 usec per loop
>     len: 10000
>     numpy: 10000 loops, best of 3: 41 usec per loop
>     list: 100 loops, best of 3: 2.17 msec per loop
>     len: 100000
>     numpy: 1000 loops, best of 3: 301 usec per loop
>     list: 10 loops, best of 3: 22.2 msec per loop
> 
> This is with Python 2.4.5 on Solaris 10.  YMMV.
> 

Skip,

Your comment is justified for len= 100 
or 1,000 but not for len= 10,000 or 100,000.

I wonder about the variability of the 
number of loops in your data.

I have tried to repeat your test with 
the program below, but it fails to cope 
with numpy.

The results for Python 2.5 are:

  list:    0.421   0.253
  list:    0.427   0.254
  list:    0.420   0.250
  list:    0.421   0.255
  list:    0.415   0.254
  list:    0.423   0.254
  list:    0.422   0.256

The results for Python 2.6 are:

  list:    0.388   0.228
  list:    0.410   0.225
  list:    0.384   0.227
  list:    0.389   0.226
  list:    0.390   0.227

  The script used above for both 2.5 and 
2.6:

# speedUgh.py To compare array timing
##import numpy
import timeit as _t
m= 100 # number of repetitions
values= (10, 100)
numpyRes= []
listRes= []

for n in values:
   sn= 'numpy.arange(' + str(n) + ')*3'
   t= _t.Timer(sn)
##  r= t.repeat(3, m)
##  numpyRes.append(sum(t.repeat(3, m)) 
* 1000000/(3*m*n))
   sl='a= [3*k for k in range(' + str(n) 
+ ')]'
   t= _t.Timer(stmt= sl)
   listRes.append( sum(t.repeat(3, m)) * 
1000000/(3*m*n))

##print 'numpy:', len(values)*'%8.3f' % 
tuple(numpyRes)
print ' list:', len(values)*'%8.3f' % 
tuple(listRes)

Colin W.



More information about the Python-list mailing list