[Numpy-discussion] Performance problems with strided arrays in NumPy
faltet at xot.carabos.com
faltet at xot.carabos.com
Fri Apr 14 14:36:06 EDT 2006
Hi,
I'm seeing some slowness in NumPy when dealing with strided arrays.
numarray is dealing better with these situations, so I guess that
something could be done in NumPy about this. Below are the situations
that I've found up to now (maybe there are others). For the timings,
I've used numpy 0.9.7.2278 and numarray 1.5.1.
It seems that NumPy copy() method is almost 3x slower than in numarray:
In [105]: npcopy=timeit.Timer('b=a.copy()','import numpy as
np;a=np.arange(1000000,dtype="Float64")[::10]')
In [106]: npcopy.repeat(3,10)
Out[106]: [0.171913146972656, 0.175906896591186, 0.171195983886718]
In [107]: nacopy=timeit.Timer('b=a.copy()','import numarray as
np;a=np.arange(1000000,type="Float64")[::10]')
In [108]: nacopy.repeat(3,10)
Out[108]: [0.065090894699096, 0.0630550384521484, 0.0626609325408935]
However, a copy without strides performs similarly in both packages
In [127]: npcopy2=timeit.Timer('b=a.copy()','import numpy as
np;a=np.arange(1000000,dtype="Float64")')
In [128]: npcopy2.repeat(3,10)
Out[128]: [0.24657797813415527, 0.24657106399536133, 0.2464911937713623]
In [129]: nacopy2=timeit.Timer('b=a.copy()','import numarray as
np;a=np.arange(1000000,type="Float64")')
In [130]: nacopy2.repeat(3,10)
Out[130]: [0.244544982910156, 0.251885890960693, 0.2419440746307373]
--------------------------------------------
where() seems more than 2x slower in NumPy than in numarray:
In [136]: tnpf=timeit.Timer('np.where(a + b < 10, a, b)','import numpy
as np;a=np.arange(100000,dtype="float64");b=a*2')
In [137]: tnpf.repeat(3,10)
Out[137]: [0.225586891174316, 0.22503495216369629, 0.224209785461425]
In [138]: tnaf=timeit.Timer('np.where(a + b < 2, a, b)','import
numarray as np;a=np.arange(100000,type="Float64");b=a*2')
In [139]: tnaf.repeat(3,10)
Out[139]: [0.108436822891235, 0.1069340705871582, 0.10654377937316895]
However, for where() without parameters, NumPy performs slightly
better than numarray:
In [143]: tnpf2=timeit.Timer('np.where(a + b < 10)','import numpy as
np;a=np.arange(100000,dtype="float64");b=a*2')
In [144]: tnpf2.repeat(3,10)
Out[144]: [0.0759999752044677, 0.0731539726257324, 0.073034048080444336]
In [145]: tnaf2=timeit.Timer('np.where(a + b < 2)','import numarray as
np;a=np.arange(100000,type="Float64");b=a*2')
In [146]: tnaf2.repeat(3,10)
Out[146]: [0.0890851020812988, 0.0853078365325927, 0.085799932479858398]
Cheers,
Francesc
More information about the NumPy-Discussion
mailing list