Hi Eric, I just checked out your change and it works another 0.2s faster than what I had for my example, so I'm more than happy with the final result. Thanks for taking the time to put my hazy ideas into practice the right way :-)
Cheers, Tim On 5/10/07, Eric Firing <[EMAIL PROTECTED]> wrote: > Tim, > > I couldn't resist; here is a numerix version of the method, which I > committed to svn: > > def get_transformed_patches(self): > # Shouldn't need all these calls to asarray; > # the variables should be converted when stored. > # Similar speedups with numerix should be attainable > # in many other places. > verts = asarray(self._verts) > offsets = asarray(self._offsets) > Npoly = len(offsets) > scales = sqrt(asarray(self._sizes)*self._dpi.get()/72.0) > Nscales = len(scales) > if Nscales >1: > scales = resize(scales, (Npoly, 1, 1)) > transOffset = self.get_transoffset() > xyo = transOffset.numerix_xy(offsets) > polys = scales * verts + xyo[:, newaxis, :] > return polys > > It is faster even when there are only three polygons; and as the comment > indicates, it would be even faster with additional numpification of the > entire class. (Present version with 3 polys, 161 usecs vs 241 usecs; > with 1000, 6.4 msec vs 47.3 msec.) > > It is also only lightly tested. I hope I haven't overlooked some > situation that would work with the old version but not with this one. > > Eric > > Tim Leslie wrote: > > On 5/10/07, Eric Firing <[EMAIL PROTECTED]> wrote: > >> Tim, > >> > >> Based on a *very superficial* quick look, I have two comments: > >> > >> 1) Since the plan is (or was?) to have one more release before > >> specializing to numpy-only support, the ".T" won't work at present. > >> > >> 2) In the following (possibly mangled by mailer), > >> > >> > + if Nsizes == 1: > >> > + xy = asarray([xverts, yverts]).T * sizes[0] > >> > + polys = [xy + offset for offset in > >> transOffset.seq_xy_tups(self._offsets)] > >> > >> I think you can gain additional speedup by eliminating the list > >> comprehension. Instead of using seq_xy_tups you can use numerix_xy to > >> return a 2-D array (with columns x and y), and simply add that to xy. > >> > > > > Thanks for the feedback Eric, I'll rework the patch with your comments > > in mind. I also just noticed a rather glaring bug, in that I don't > > actually have a 'return polys' after I calculate them in the special > > case, which is somewhat embarrassing. I'll fix all this up and submit > > a new patch later today. > > > > Cheers, > > > > Tim > > > >> Eric > >> > >> > >> Tim Leslie wrote: > >> > Hi All, > >> > > >> > I've attached a patch which optimizes a particular case of the > >> > RegularPolyCollection.get_transformed_patches method. This is > >> > particularly useful when using a picker on a scatter plot with ~40,000 > >> > points (as I happen to be doing) and cuts the time spent in this > >> > function from ~4s to ~1s, which accounts for about 50% of the lag in > >> > my particular use case. > >> > > >> > Similar improvements might be possible in the N > 1 case, but I don't > >> > have a) a data set or b) the time to work them out with, so hopefully > >> > someone is happy to check in this patch as it stands, as I think the > >> > N==1 is probably the common case. > >> > > >> > If there are any problems with the patch let me know and I'll try to > >> > fix it up. It's against latest svn (3262) > >> > > >> > Cheers, > >> > > >> > Tim > >> > > >> > > >> > > >> ------------------------------------------------------------------------ > >> > > >> > Index: lib/matplotlib/collections.py > >> > =================================================================== > >> > --- lib/matplotlib/collections.py (revision 3262) > >> > +++ lib/matplotlib/collections.py (working copy) > >> > @@ -153,7 +153,7 @@ > >> > if not self.pickable(): return > >> > ind = [] > >> > x, y = mouseevent.x, mouseevent.y > >> > - for i, thispoly in enumerate(self.get_transformed_patches()): > >> > + for i, thispoly in enumerate(self.get_transformed_patches()): > >> > inside = nxutils.pnpoly(x, y, thispoly) > >> > if inside: ind.append(i) > >> > if len(ind): > >> > @@ -167,7 +167,6 @@ > >> > The ith element in the returned sequence is a list of x,y > >> > vertices defining the ith polygon > >> > """ > >> > - > >> > verts = self._verts > >> > offsets = self._offsets > >> > usingOffsets = offsets is not None > >> > @@ -451,13 +450,19 @@ > >> > __init__.__doc__ = dedent(__init__.__doc__) % kwdocd > >> > > >> > def get_transformed_patches(self): > >> > - > >> > + > >> > xverts, yverts = zip(*self._verts) > >> > xverts = asarray(xverts) > >> > yverts = asarray(yverts) > >> > sizes = sqrt(asarray(self._sizes)*self._dpi.get()/72.0) > >> > Nsizes = len(sizes) > >> > transOffset = self.get_transoffset() > >> > + > >> > + # optimize this case for an approx 4x speedup > >> > + if Nsizes == 1: > >> > + xy = asarray([xverts, yverts]).T * sizes[0] > >> > + polys = [xy + offset for offset in > >> transOffset.seq_xy_tups(self._offsets)] > >> > + > >> > polys = [] > >> > for i, loc in enumerate(self._offsets): > >> > xo,yo = transOffset.xy_tup(loc) > >> > > >> > > >> > > >> ------------------------------------------------------------------------ > >> > > >> > > >> ------------------------------------------------------------------------- > >> > This SF.net email is sponsored by DB2 Express > >> > Download DB2 Express C - the FREE version of DB2 express and take > >> > control of your XML. No limits. Just data. Click to get it now. > >> > http://sourceforge.net/powerbar/db2/ > >> > > >> > > >> > > >> ------------------------------------------------------------------------ > >> > > >> > _______________________________________________ > >> > Matplotlib-devel mailing list > >> > Matplotlib-devel@lists.sourceforge.net > >> > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel > >> > >> > > ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Matplotlib-devel mailing list Matplotlib-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-devel