Browse Source

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 <nick@nickpope.me.uk>
Keryn Knight 3 years ago
parent
commit
3de787a70b
1 changed files with 4 additions and 1 deletions
  1. 4 1
      django/utils/datastructures.py

+ 4 - 1
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):