Hey Stefan, From just looking at the function, there is only one case in the for loop that is non-trivial, so I'm thinking the function could be restructured as:
cdef bint __exchange(self, long x, long y): """ Put element indexed by ``x`` into basis, taking out element ``y``. Assumptions are that this is a valid basis exchange. .. NOTE:: Safe for noncommutative rings. """ cdef long px, py, r cdef LeanMatrix A = self._A px = self._prow[x] py = self._prow[y] piv = A.get_unsafe(px, py) pivi = piv ** (-1) # This would be a simple modification of the previous, removing the for loop #a = pivi + self._one #A.row_scale(px, pivi) #A.set_unsafe(px, py, a) # pivoting without column scaling. Add extra so column does not need adjusting # if A and A' are the matrices before and after pivoting, then # ker[I A] equals ker[I A'] except for the labelling of the columns #if a: # A.row_add(px, px, -a) #A.set_unsafe(px, py, pivi) # This is with some other (possible) (micro) optimizations if pivi + self._one != 0: A.row_scale(px, -pivi * pivi) else: A.row_scale(px, pivi) A.set_unsafe(px, py, pivi) self._prow[y] = px self._prow[x] = py BasisExchangeMatroid.__exchange(self, x, y) For the second one, I use the fact that pivi * A_ij - (pivi + 1) * pivi * A_ij = -pivi^2 * A_ij All I've done is unraveled the outcome of the code by following the logic (interpret that as I haven't tested it), but this should net (again, provided I didn't make any mistakes) a nice speed increase. Also, if you're not really using matrices, such as doing a significant number of multiplications/using category model/etc., but instead as a nice data structure, I'd be more inclined to say to strip out the non speed-essential methods, making it as lightweight and specific as possible and converting to proper matrices when needed, and include it into sage (after perhaps changing the name). How does this sound to everyone? Best, Travis -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel?hl=en. For more options, visit https://groups.google.com/groups/opt_out.