diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2018-12-30 09:24:03 (GMT) |
---|---|---|
committer | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2018-12-30 09:24:03 (GMT) |
commit | 3f5fc70c6213008243e7d605f7d8a2d8f94cf919 (patch) | |
tree | 44c396f3a052803c4725eec2e6ccb1ab32529c8f /Lib/collections | |
parent | b0a6196ffd58ff91462191f426706897dc920eee (diff) | |
download | cpython-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__.py | 14 |
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) |