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