I'm not sure there is going to be a good solution. If the matrix, m, is dense then let's assume it is full. If we want to take the product of some row and column in m then what we want to know is how `p=m[r][i]*m[i][c]` compares with `r=m.getrow(r); c=m.getcol(c); p=r[i]*c[i]` where getrow and getcol are some routines that will somehow get the row and col from m as fast as possible. If m is a list of lists corresponding to rows then getrow is just m[r] and getcol is (the slow) [m[i][c] for i in range(len(m))]. @toolforger or @rlamy may have something to say regarding this sort of optimization concern, something like "is that the slow step for the process?". Is this really the slow step (or that significant)? If so, then I imagine the "workaround" is to buy more space and store both row and col vectors; effectively doubling the storage in exchange for speed.

But sympy is symbolic -- should we really be worrying about such issues? Are there problems with a symbolic solution that require very fast matrix multiplication?