From 3de787a70b6c140a3b1289a8ce12b17ebcb8a200 Mon Sep 17 00:00:00 2001
From: Keryn Knight <keryn@kerynknight.com>
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 <nick@nickpope.me.uk>
---
 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):