From 89ded2a5edfbdc0b513e17716017386017532764 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 19 Jan 2024 20:04:14 +0100 Subject: [PATCH 1/2] Improve performance of copy.deepcopy for atomic type using special value for copier --- Lib/copy.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/Lib/copy.py b/Lib/copy.py index a69bc4e78c20b3..cff5bb06fffd28 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -132,6 +132,11 @@ def deepcopy(x, memo=None, _nil=[]): cls = type(x) copier = _deepcopy_dispatch.get(cls) + + if copier is ...: + # atomic type + return x + if copier is not None: y = copier(x, memo) else: @@ -169,24 +174,14 @@ def deepcopy(x, memo=None, _nil=[]): _deepcopy_dispatch = d = {} +_atomic_types = {types.NoneType, types.EllipsisType, types.NotImplementedType, + int, float, bool, complex, bytes, str, types.CodeType, type, range, + types.BuiltinFunctionType, types.FunctionType, weakref.ref, property} + +for _type in _atomic_types: + d[_type] = ... def _deepcopy_atomic(x, memo): return x -d[types.NoneType] = _deepcopy_atomic -d[types.EllipsisType] = _deepcopy_atomic -d[types.NotImplementedType] = _deepcopy_atomic -d[int] = _deepcopy_atomic -d[float] = _deepcopy_atomic -d[bool] = _deepcopy_atomic -d[complex] = _deepcopy_atomic -d[bytes] = _deepcopy_atomic -d[str] = _deepcopy_atomic -d[types.CodeType] = _deepcopy_atomic -d[type] = _deepcopy_atomic -d[range] = _deepcopy_atomic -d[types.BuiltinFunctionType] = _deepcopy_atomic -d[types.FunctionType] = _deepcopy_atomic -d[weakref.ref] = _deepcopy_atomic -d[property] = _deepcopy_atomic def _deepcopy_list(x, memo, deepcopy=deepcopy): y = [] From b8c57fafa878a3338f9740f6b6af848a965233f2 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Fri, 19 Jan 2024 20:47:33 +0100 Subject: [PATCH 2/2] move atomic check before memo check --- Lib/copy.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Lib/copy.py b/Lib/copy.py index cff5bb06fffd28..6ee55e8352471c 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -121,6 +121,13 @@ def deepcopy(x, memo=None, _nil=[]): See the module's __doc__ string for more info. """ + cls = type(x) + copier = _deepcopy_dispatch.get(cls) + + if copier is ...: + # atomic type + return x + d = id(x) if memo is None: memo = {} @@ -129,13 +136,6 @@ def deepcopy(x, memo=None, _nil=[]): if y is not _nil: return y - cls = type(x) - - copier = _deepcopy_dispatch.get(cls) - - if copier is ...: - # atomic type - return x if copier is not None: y = copier(x, memo)