[Numpy-discussion] My identity

Keith Goodman kwgoodman at gmail.com
Mon Jul 20 11:39:50 EDT 2009


Using a trick that Robert Kern recently posted to the list makes the
identity function much faster.

Current version:

def identity(n, dtype=None):
    a = array([1]+n*[0],dtype=dtype)
    b = empty((n,n),dtype=dtype)
    b.flat = a
    return b

Proposed version:

def myidentity(n, dtype=None):
    a = zeros((n,n), dtype=dtype)
    a.flat[::n+1] = 1
    return a

>> timeit identity(1)
100000 loops, best of 3: 14.9 µs per loop
>> timeit identity(10)
10000 loops, best of 3: 20 µs per loop
>> timeit identity(100)
1000 loops, best of 3: 696 µs per loop
>> timeit identity(1000)
10 loops, best of 3: 73.6 ms per loop

>> timeit myidentity(1)
100000 loops, best of 3: 6.57 µs per loop
>> timeit myidentity(10)
100000 loops, best of 3: 7.08 µs per loop
>> timeit myidentity(100)
100000 loops, best of 3: 16.4 µs per loop
>> timeit myidentity(1000)
100 loops, best of 3: 5.92 ms per loop

It would also speed up the functions that use identity (for example
np.linalg.inv). And it would make identity faster than eye.

Are there any corner cases that the new version doesn't handle? Any
other issues?



More information about the NumPy-Discussion mailing list