Skip to content

Avoid TransformedBbox where unneeded. #21010

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 8, 2021
Merged

Conversation

anntzer
Copy link
Contributor

@anntzer anntzer commented Sep 7, 2021

transform_bbox is much faster when one does not need a TransformedBbox,
i.e. something that keeps track of later changes in the transform:

In [1]: from pylab import *
   ...: from matplotlib.transforms import *
   ...: tr = plt.gca().transAxes
   ...: bb = Bbox([[0, 0], [1, 1]])
   ...: %timeit TransformedBbox(bb, tr).x0
   ...: %timeit tr.transform_bbox(bb).x0
   ...: %timeit TransformedBbox(bb, tr).width
   ...: %timeit tr.transform_bbox(bb).width
11.8 µs ± 145 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.72 µs ± 31.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
11.9 µs ± 183 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.83 µs ± 16.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

(I don't know if any of the places changed here are actually performance-critical, but this just seems good practice...)

PR Summary

PR Checklist

  • Has pytest style unit tests (and pytest passes).
  • Is Flake 8 compliant (run flake8 on changed files to check).
  • New features are documented, with examples if plot related.
  • Documentation is sphinx and numpydoc compliant (the docs should build without error).
  • Conforms to Matplotlib style conventions (install flake8-docstrings and run flake8 --docstring-convention=all).
  • New features have an entry in doc/users/next_whats_new/ (follow instructions in README.rst there).
  • API changes documented in doc/api/next_api_changes/ (follow instructions in README.rst there).

@QuLogic
Copy link
Member

QuLogic commented Sep 7, 2021

Tests don't seem to like this.

transform_bbox is much faster when one does not need a TransformedBbox,
i.e. something that keeps track of later changes in the transform:
```
In [1]: from pylab import *
   ...: from matplotlib.transforms import *
   ...: tr = plt.gca().transAxes
   ...: bb = Bbox([[0, 0], [1, 1]])
   ...: %timeit TransformedBbox(bb, tr).x0
   ...: %timeit tr.transform_bbox(bb).x0
   ...: %timeit TransformedBbox(bb, tr).width
   ...: %timeit tr.transform_bbox(bb).width
11.8 µs ± 145 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.72 µs ± 31.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
11.9 µs ± 183 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.83 µs ± 16.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
```
@anntzer
Copy link
Contributor Author

anntzer commented Sep 7, 2021

Should hopefully be fixed now; the failures arose due to #12059 (transform_bbox doesn't capture rotation semantics; fortunately that's not needed for tight_bbox, tight_layout, or inset_locator).

@dstansby dstansby merged commit 87bae58 into matplotlib:master Sep 8, 2021
@anntzer anntzer deleted the ntb branch September 8, 2021 12:14
@QuLogic QuLogic added this to the v3.6.0 milestone Sep 8, 2021
tacaswell pushed a commit that referenced this pull request Oct 20, 2021
Avoid TransformedBbox where unneeded.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants