Skip to content

Loading…

A faster identity function (Trac #1193) #1791

Closed
thouis opened this Issue · 5 comments

1 participant

@thouis

Original ticket http://projects.scipy.org/numpy/ticket/1193 on 2009-08-12 by @kwgoodman, assigned to unknown.

Using a trick that Robert Kern recently posted to the numpy 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).

@thouis

@kwgoodman wrote on 2009-08-12

Sorry, I didn't format the code. Here's the formatted versions:

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

BTW, is there a way to edit a ticket? I don't see it.

@thouis

Attachment added by @scottza on 2009-08-12: identity.patch

@thouis

@scottza wrote on 2009-08-12

Proposal formatted as a patch against current trunk. No test failures on my system..

@thouis

@charris wrote on 2009-08-12

Fixed in r7303.

@thouis

Milestone changed to 1.4.0 by @charris on 2009-08-12

@thouis thouis closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.