[SciPy-user] Very slow comparison of arrays of integers

Robert Kern rkern at ucsd.edu
Mon Jul 18 03:15:47 CDT 2005


Brian Granger wrote:
> Hello all,
> 
> I have some code that is using scipy/numeric and one bottleneck in  the 
> code consists of comparing arrays or lists of integers.  To my  dismay, 
> I am finding that using Python lists is 15-20 times _faster_  than using 
> numeric array's for this.  The problem is that it seems  that there is 
> no efficient way to compare arrays of integers.
> 
> Here is code that clearly demonstrates this problem:
> 
> from scipy import *
> 
> def test_list(n):
>     a = range(100)
>     for i in range(n):
>         r = (a == a)
> 
> def test_array(n):
>     a = array(range(100),Int)
>     for i in range(n):
>         r = allclose(a,a)
> 
> The test_list code runs about 20 times as fast as the test_array code  
> that uses allclose().
> 
> Is there any way of comparing to arrays of integers that would be as  
> fast or faster than using lists?  Any hints would be greatly  appreciated.

allclose() is for floating point arrays. Use alltrue(x == y) for integer 
arrays.

Also, use numbers > 100. Small integer objects are cached and object 
identity is checked first, I believe.

In [28]: tlist = timeit.Timer("a == a", setup="a = range(1000, 2000)")
In [29]: tarray = timeit.Timer("alltrue(a == a)", setup="from scipy 
import alltrue,arange; a = arange(1000, 2000)")

In [30]: tarray.repeat(3, 1000)
Out[30]: [0.097441911697387695, 0.049738168716430664, 0.051641941070556641]

In [31]: tlist.repeat(3, 1000)
Out[31]: [0.1062159538269043, 0.062600851058959961, 0.063454866409301758]

-- 
Robert Kern
rkern at ucsd.edu

"In the fields of hell where the grass grows high
  Are the graves of dreams allowed to die."
   -- Richard Harter



More information about the SciPy-user mailing list