diff options
author | Pieter Eendebak <pieter.eendebak@gmail.com> | 2024-12-30 17:18:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-30 17:18:42 (GMT) |
commit | 34b85ef26c44bbbd8a05d3e7dee6997b3623aab0 (patch) | |
tree | 997cb2b26d7f6e131fe1cf71da90cb148152c5ec /Lib | |
parent | 348012432155271cfbee71a78d0c27254fc230e2 (diff) | |
download | cpython-34b85ef26c44bbbd8a05d3e7dee6997b3623aab0.zip cpython-34b85ef26c44bbbd8a05d3e7dee6997b3623aab0.tar.gz cpython-34b85ef26c44bbbd8a05d3e7dee6997b3623aab0.tar.bz2 |
gh-128118: Speed up copy.copy with fast lookup for atomic and container types (#128119)
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/copy.py | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/Lib/copy.py b/Lib/copy.py index f27e109..c64fc07 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -67,13 +67,15 @@ def copy(x): cls = type(x) - copier = _copy_dispatch.get(cls) - if copier: - return copier(x) + if cls in _copy_atomic_types: + return x + if cls in _copy_builtin_containers: + return cls.copy(x) + if issubclass(cls, type): # treat it as a regular class: - return _copy_immutable(x) + return x copier = getattr(cls, "__copy__", None) if copier is not None: @@ -98,23 +100,12 @@ def copy(x): return _reconstruct(x, None, *rv) -_copy_dispatch = d = {} - -def _copy_immutable(x): - return x -for t in (types.NoneType, int, float, bool, complex, str, tuple, +_copy_atomic_types = {types.NoneType, int, float, bool, complex, str, tuple, bytes, frozenset, type, range, slice, property, types.BuiltinFunctionType, types.EllipsisType, types.NotImplementedType, types.FunctionType, types.CodeType, - weakref.ref, super): - d[t] = _copy_immutable - -d[list] = list.copy -d[dict] = dict.copy -d[set] = set.copy -d[bytearray] = bytearray.copy - -del d, t + weakref.ref, super} +_copy_builtin_containers = {list, dict, set, bytearray} def deepcopy(x, memo=None, _nil=[]): """Deep copy operation on arbitrary Python objects. |