From 0c62ae53c4c5d41783d79de8553334c1adfabb96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Mokrej=C5=A1?= Date: Fri, 9 Aug 2013 23:06:55 +0200 Subject: [PATCH] speedup figure rendering removal of .startswith() calls and use generators instead of for loops --- lib/matplotlib/artist.py | 8 ++++---- lib/matplotlib/axes/_axes.py | 6 +++--- lib/matplotlib/figure.py | 25 +++++++++---------------- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index 2e06d200bc13..df7c710d1685 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -892,7 +892,7 @@ def get_aliases(self): """ names = [name for name in dir(self.o) if - (name.startswith('set_') or name.startswith('get_')) + (name[:4] in ['set_', 'get_']) and callable(getattr(self.o, name))] aliases = {} for name in names: @@ -927,7 +927,7 @@ def get_valid_values(self, attr): if docstring is None: return 'unknown' - if docstring.startswith('alias for '): + if docstring[:10] == 'alias for ': return None match = self._get_valid_values_regex.search(docstring) @@ -943,7 +943,7 @@ def _get_setters_and_targets(self): setters = [] for name in dir(self.o): - if not name.startswith('set_'): + if name[:4] != 'set_': continue o = getattr(self.o, name) if not callable(o): @@ -975,7 +975,7 @@ def is_alias(self, o): ds = o.__doc__ if ds is None: return False - return ds.startswith('alias for ') + return ds[:10] == 'alias for ' def aliased_name(self, s): """ diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 986d5fa6b52f..bebef0493332 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -238,7 +238,7 @@ def get_legend_handles_labels(self, legend_handler_map=None): labels = [] for handle in self._get_legend_handles(legend_handler_map): label = handle.get_label() - if label and not label.startswith('_'): + if label and label[0] != '_': handles.append(handle) labels.append(label) @@ -5264,7 +5264,7 @@ def hist(self, x, bins=10, range=None, normed=False, weights=None, patches = [] - if histtype.startswith('bar'): + if histtype[:3] == 'bar': # Save autoscale state for later restoration; turn autoscaling # off so we can do it all a single time at the end, instead # of having it done by bar or fill and then having to be redone. @@ -5326,7 +5326,7 @@ def hist(self, x, bins=10, range=None, normed=False, weights=None, self.set_autoscaley_on(_saved_autoscaley) self.autoscale_view() - elif histtype.startswith('step'): + elif histtype[:4] == 'step': # these define the perimeter of the polygon x = np.zeros(4 * len(bins) - 3, np.float) y = np.zeros(4 * len(bins) - 3, np.float) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 324fecaeb906..b3a0dd6b2eaf 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -972,17 +972,12 @@ def draw(self, renderer): self.patch.draw(renderer) # a list of (zorder, func_to_call, list_of_args) - dsu = [] + dsu = [(x.get_zorder(), x, x.draw, [renderer]) for x in self.patches ] - for a in self.patches: - dsu.append((a.get_zorder(), a, a.draw, [renderer])) - - for a in self.lines: - dsu.append((a.get_zorder(), a, a.draw, [renderer])) - - for a in self.artists: - dsu.append((a.get_zorder(), a, a.draw, [renderer])) + dsu.extend((x.get_zorder(), x, x.draw, [renderer]) for x in self.lines) + dsu.extend((x.get_zorder(), x, x.draw, [renderer]) for x in self.artists) + # override the renderer default if self.suppressComposite # is not None not_composite = renderer.option_image_nocomposite() @@ -1018,19 +1013,17 @@ def draw_composite(): draw_composite, [])) # render the axes - for a in self.axes: - dsu.append((a.get_zorder(), a, a.draw, [renderer])) + dsu.extend((x.get_zorder(), x, x.draw, [renderer]) for x in self.axes) # render the figure text - for a in self.texts: - dsu.append((a.get_zorder(), a, a.draw, [renderer])) + dsu.extend((x.get_zorder(), x, x.draw, [renderer]) for x in self.texts) - for a in self.legends: - dsu.append((a.get_zorder(), a, a.draw, [renderer])) + # render the figure legends + dsu.extend((x.get_zorder(), x, x.draw, [renderer]) for x in self.legends) dsu = [row for row in dsu if not row[1].get_animated()] dsu.sort(key=itemgetter(0)) - for zorder, a, func, args in dsu: + for zorder, a, func, args in dsu: # this also needs to go away for speed func(*args) renderer.close_group('figure')