Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a3c6066

Browse files
committed
Speed up _delete_parameter.
`_delete_parameter` is currently used on `Tick.__init__`, which is called *very* often when creating many axes. This patch speeds up ``` MPLBACKEND=agg python -mtimeit -s 'from matplotlib.figure import Figure' -- 'Figure().subplots(10, 10)' ``` by ~20-25% (currently, just generating an 10x10 empty grid of axes takes ~1s).
1 parent 06dc612 commit a3c6066

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

lib/matplotlib/_api/deprecation.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import contextlib
1414
import functools
1515
import inspect
16+
import math
1617
import warnings
1718

1819

@@ -390,12 +391,22 @@ def func(used_arg, other_arg, unused, more_args): ...
390391
is_varargs = kind is inspect.Parameter.VAR_POSITIONAL
391392
is_varkwargs = kind is inspect.Parameter.VAR_KEYWORD
392393
if not is_varargs and not is_varkwargs:
394+
name_idx = (
395+
# Deprecated parameter can't be passed positionally.
396+
math.inf if kind is inspect.Parameter.KEYWORD_ONLY
397+
# If call site has no more than this number of parameters, the
398+
# deprecated parameter can't have been passed positionally.
399+
else [*signature.parameters].index(name))
393400
func.__signature__ = signature = signature.replace(parameters=[
394401
param.replace(default=_deprecated_parameter)
395402
if param.name == name else param
396403
for param in signature.parameters.values()])
404+
else:
405+
name_idx = -1 # Deprecated parameter can always have been passed.
397406
else:
398407
is_varargs = is_varkwargs = False
408+
# Deprecated parameter can't be passed positionally.
409+
name_idx = math.inf
399410
assert kwargs_name, (
400411
f"Matplotlib internal error: {name!r} must be a parameter for "
401412
f"{func.__name__}()")
@@ -404,6 +415,10 @@ def func(used_arg, other_arg, unused, more_args): ...
404415

405416
@functools.wraps(func)
406417
def wrapper(*inner_args, **inner_kwargs):
418+
if len(inner_args) <= name_idx and name not in inner_kwargs:
419+
# Early return in the simple, non-deprecated case (much faster than
420+
# calling bind()).
421+
return func(*inner_args, **inner_kwargs)
407422
arguments = signature.bind(*inner_args, **inner_kwargs).arguments
408423
if is_varargs and arguments.get(name):
409424
warn_deprecated(

0 commit comments

Comments
 (0)