>>>>> "Tom" == Tom Denniston <[EMAIL PROTECTED]> writes:
Tom> I've been profiling some of my code which builds many
Tom> somewhat complex graphs. I've noticed that it spends almost
Tom> all it's time in the __init__ of the artist class. The time
Tom> there is almost entirely spent on calling identity_transform
Tom> which builds a SeperableTransform that does no
Tom> transforming--from what I can tell--which is consistent with
Tom> the name. The identity transform function buid a bunch of
Tom> other objects all of which are the same each time. My
Tom> question is, does it really need to build all these objects
Tom> over and over again. Given that Artist's __init__ is called
Tom> by so many things wouldn't it be better to have some static
Tom> constants to define these default transformation functions?
Tom> Am I missing something subtle or would this be an
Tom> improvement?
I'm hesitant to make a single (shared) identity transform since
transforms are mutable. But since most objects to not use the
identity_transform but rather a custom one, we can create it
lazily. I've implemented these changes in svn. Each artist (as
before) has a _transform instance but now it defaults to None. Then
in get_transform
def get_transform(self):
'return the Transformation instance used by this artist'
if self._transform is None:
self._transform = identity_transform()
return self._transform
The harder part was modifying all of the derived classes that were
using the _transform attr directly -- all these had to be ported to
use get_transform instead. The changes are documented in API_CHANGES.
See if it speeds up your code -- it didn't make an appreciable change
to backend_driver.
Note the artist constructor shouldn't be a bottleneck in your python
script. If it is, you are probably creating lots-o-artists and you
might be able to use a collection instead. Eg, if you are making
hundreds or thousands of calls to plot and creating a comparable
number of Line2D artists, use a LineCollection instead.
But if you are still experiencing a problem and the changes I made to
svn don't help (eg if you are creating lots of objects that do require
the default identity_transform), you can experiment with using a
single cached identity_transform. Something like
import matplotlib.artist
_cached_transform = matplotlib.artist.identity_transform()
def my_identity_transform():
return _cached_transform
matplotlib.artist.identity_transform = my_identity_transform
# import the rest of mpl here
Hope this helps...
JDH
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users