Skip to content

Commit

Permalink
gh-128118: Speed up copy.copy with fast lookup for atomic and contain…
Browse files Browse the repository at this point in the history
…er types (#128119)
  • Loading branch information
eendebakpt authored Dec 30, 2024
1 parent 3480124 commit 34b85ef
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 18 deletions.
27 changes: 9 additions & 18 deletions Lib/copy.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Improve performance of :func:`copy.copy` by 30% via
a fast path for atomic types and container types.

0 comments on commit 34b85ef

Please sign in to comment.