Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to · python/cpython@ec569b7 (original) (raw)
`@@ -75,15 +75,21 @@ class B(object):
`
75
75
`pass
`
76
76
`b = B()
`
77
77
`self.assertEqual(issubclass(B, A), False)
`
``
78
`+
self.assertEqual(issubclass(B, (A,)), False)
`
78
79
`self.assertEqual(isinstance(b, A), False)
`
``
80
`+
self.assertEqual(isinstance(b, (A,)), False)
`
79
81
`A.register(B)
`
80
82
`self.assertEqual(issubclass(B, A), True)
`
``
83
`+
self.assertEqual(issubclass(B, (A,)), True)
`
81
84
`self.assertEqual(isinstance(b, A), True)
`
``
85
`+
self.assertEqual(isinstance(b, (A,)), True)
`
82
86
`class C(B):
`
83
87
`pass
`
84
88
`c = C()
`
85
89
`self.assertEqual(issubclass(C, A), True)
`
``
90
`+
self.assertEqual(issubclass(C, (A,)), True)
`
86
91
`self.assertEqual(isinstance(c, A), True)
`
``
92
`+
self.assertEqual(isinstance(c, (A,)), True)
`
87
93
``
88
94
`def test_isinstance_invalidation(self):
`
89
95
`class A(metaclass=abc.ABCMeta):
`
`@@ -92,22 +98,29 @@ class B:
`
92
98
`pass
`
93
99
`b = B()
`
94
100
`self.assertEqual(isinstance(b, A), False)
`
``
101
`+
self.assertEqual(isinstance(b, (A,)), False)
`
95
102
`A.register(B)
`
96
103
`self.assertEqual(isinstance(b, A), True)
`
``
104
`+
self.assertEqual(isinstance(b, (A,)), True)
`
97
105
``
98
106
`def test_registration_builtins(self):
`
99
107
`class A(metaclass=abc.ABCMeta):
`
100
108
`pass
`
101
109
`A.register(int)
`
102
110
`self.assertEqual(isinstance(42, A), True)
`
``
111
`+
self.assertEqual(isinstance(42, (A,)), True)
`
103
112
`self.assertEqual(issubclass(int, A), True)
`
``
113
`+
self.assertEqual(issubclass(int, (A,)), True)
`
104
114
`class B(A):
`
105
115
`pass
`
106
116
`B.register(str)
`
107
117
`class C(str): pass
`
108
118
`self.assertEqual(isinstance("", A), True)
`
``
119
`+
self.assertEqual(isinstance("", (A,)), True)
`
109
120
`self.assertEqual(issubclass(str, A), True)
`
``
121
`+
self.assertEqual(issubclass(str, (A,)), True)
`
110
122
`self.assertEqual(issubclass(C, A), True)
`
``
123
`+
self.assertEqual(issubclass(C, (A,)), True)
`
111
124
``
112
125
`def test_registration_edge_cases(self):
`
113
126
`class A(metaclass=abc.ABCMeta):
`
`@@ -130,29 +143,40 @@ def test_registration_transitiveness(self):
`
130
143
`class A(metaclass=abc.ABCMeta):
`
131
144
`pass
`
132
145
`self.failUnless(issubclass(A, A))
`
``
146
`+
self.failUnless(issubclass(A, (A,)))
`
133
147
`class B(metaclass=abc.ABCMeta):
`
134
148
`pass
`
135
149
`self.failIf(issubclass(A, B))
`
``
150
`+
self.failIf(issubclass(A, (B,)))
`
136
151
`self.failIf(issubclass(B, A))
`
``
152
`+
self.failIf(issubclass(B, (A,)))
`
137
153
`class C(metaclass=abc.ABCMeta):
`
138
154
`pass
`
139
155
`A.register(B)
`
140
156
`class B1(B):
`
141
157
`pass
`
142
158
`self.failUnless(issubclass(B1, A))
`
``
159
`+
self.failUnless(issubclass(B1, (A,)))
`
143
160
`class C1(C):
`
144
161
`pass
`
145
162
`B1.register(C1)
`
146
163
`self.failIf(issubclass(C, B))
`
``
164
`+
self.failIf(issubclass(C, (B,)))
`
147
165
`self.failIf(issubclass(C, B1))
`
``
166
`+
self.failIf(issubclass(C, (B1,)))
`
148
167
`self.failUnless(issubclass(C1, A))
`
``
168
`+
self.failUnless(issubclass(C1, (A,)))
`
149
169
`self.failUnless(issubclass(C1, B))
`
``
170
`+
self.failUnless(issubclass(C1, (B,)))
`
150
171
`self.failUnless(issubclass(C1, B1))
`
``
172
`+
self.failUnless(issubclass(C1, (B1,)))
`
151
173
`C1.register(int)
`
152
174
`class MyInt(int):
`
153
175
`pass
`
154
176
`self.failUnless(issubclass(MyInt, A))
`
``
177
`+
self.failUnless(issubclass(MyInt, (A,)))
`
155
178
`self.failUnless(isinstance(42, A))
`
``
179
`+
self.failUnless(isinstance(42, (A,)))
`
156
180
``
157
181
`def test_all_new_methods_are_called(self):
`
158
182
`class A(metaclass=abc.ABCMeta):
`