summaryrefslogtreecommitdiffstats
path: root/Lib/collections
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2018-12-30 09:24:03 (GMT)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>2018-12-30 09:24:03 (GMT)
commit3f5fc70c6213008243e7d605f7d8a2d8f94cf919 (patch)
tree44c396f3a052803c4725eec2e6ccb1ab32529c8f /Lib/collections
parentb0a6196ffd58ff91462191f426706897dc920eee (diff)
downloadcpython-3f5fc70c6213008243e7d605f7d8a2d8f94cf919.zip
cpython-3f5fc70c6213008243e7d605f7d8a2d8f94cf919.tar.gz
cpython-3f5fc70c6213008243e7d605f7d8a2d8f94cf919.tar.bz2
bpo-32492: 1.6x speed up in namedtuple attribute access using C fast-path (#10495)
* bpo-32492: 2.5x speed up in namedtuple attribute access using C fast path * Add News entry * fixup! bpo-32492: 2.5x speed up in namedtuple attribute access using C fast path * Check for tuple in the __get__ of the new descriptor and don't cache the descriptor itself * Don't inherit from property. Implement GC methods to handle __doc__ * Add a test for the docstring substitution in descriptors * Update NEWS entry to reflect time against 3.7 branch * Simplify implementation with argument clinic, better error messages, only __new__ * Use positional-only parameters for the __new__ * Use PyTuple_GET_SIZE and PyTuple_GET_ITEM to tighter the implementation of tuplegetterdescr_get * Implement __set__ to make tuplegetter a data descriptor * Use Py_INCREF now that we inline PyTuple_GetItem * Apply the valid_index() function, saving one test * Move Py_None test out of the critical path.
Diffstat (limited to 'Lib/collections')
-rw-r--r--Lib/collections/__init__.py14
1 files changed, 10 insertions, 4 deletions
diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py
index 4724b0e..0b74c3f 100644
--- a/Lib/collections/__init__.py
+++ b/Lib/collections/__init__.py
@@ -311,6 +311,11 @@ except ImportError:
### namedtuple
################################################################################
+try:
+ from _collections import _tuplegetter
+except ImportError:
+ _tuplegetter = lambda index, doc: property(_itemgetter(index), doc=doc)
+
_nt_itemgetters = {}
def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None):
@@ -454,12 +459,13 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non
cache = _nt_itemgetters
for index, name in enumerate(field_names):
try:
- itemgetter_object, doc = cache[index]
+ doc = cache[index]
except KeyError:
- itemgetter_object = _itemgetter(index)
doc = f'Alias for field number {index}'
- cache[index] = itemgetter_object, doc
- class_namespace[name] = property(itemgetter_object, doc=doc)
+ cache[index] = doc
+
+ tuplegetter_object = _tuplegetter(index, doc)
+ class_namespace[name] = tuplegetter_object
result = type(typename, (tuple,), class_namespace)