From 3de787a70b6c140a3b1289a8ce12b17ebcb8a200 Mon Sep 17 00:00:00 2001 From: Keryn Knight Date: Wed, 23 Feb 2022 19:15:22 +0000 Subject: [PATCH] Fixed #33532 -- Optimized CaseInsensitiveMapping instantiation for dicts. Internal usages of this class (e.g. HttpHeaders) provide it with a dict, so testing for that type first avoids the cost of going through the potential __instancecheck__ + _abc_instancecheck to establish it's a Mapping. Co-authored-by: Nick Pope --- django/utils/datastructures.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py index b5858b8076..51a586d152 100644 --- a/django/utils/datastructures.py +++ b/django/utils/datastructures.py @@ -327,7 +327,10 @@ class CaseInsensitiveMapping(Mapping): @staticmethod def _unpack_items(data): - if isinstance(data, Mapping): + # Explicitly test for dict first as the common case for performance, + # avoiding abc's __instancecheck__ and _abc_instancecheck for the + # general Mapping case. + if isinstance(data, (dict, Mapping)): yield from data.items() return for i, elem in enumerate(data):