I just posted a patch on #561 that greatly speeds up the case when you
define a special function in a cdef class and then inherit in a
non-cdef class. Consider the following code:
cdef class NullAdder:
def __add__(self, other):
return self
class NullAdder2(NullAdder):
pass
Before the patch, I got the following timings:
sage: timeit('na + na', number=10^5, repeat=30)
100000 loops, best of 30: 94.3 ns per loop
sage: na2 = NullAdder2()
sage: timeit('na2 + na2', number=10^5, repeat=30)
100000 loops, best of 30: 261 ns per loop
so being in a subclass had 170ns of overhead. (The overhead depends
on the method; the overhead for __getattr__ is more like 700ns on the
same computer.)
After the patch, there is no penalty for the subclass:
sage: timeit('na + na', number=10^5, repeat=30)
100000 loops, best of 30: 92 ns per loop
sage: na2 = NullAdder2()
sage: timeit('na2 + na2', number=10^5, repeat=30)
100000 loops, best of 30: 92.9 ns per loop
More details are on the ticket.
I tested the patch with the Cython test suite (against 0.12.1,
0.13.beta0, and current mercurial cython-devel), and by rebuilding
Sage 4.5.1 with the modified version and running its test suite. All
tests passed.
One not-quite-a-microbenchmark got 20% faster in Sage with this patch
(adding QQbar(0) to itself went from about 26.5 microseconds to about
21 microseconds).
Given the potentially large performance benefit, I think you should
consider this patch (or something like it that's perhaps a little
cleaner) for 0.13.
Carl
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev