summaryrefslogtreecommitdiffstats
path: root/Modules/clinic
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 /Modules/clinic
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 'Modules/clinic')
-rw-r--r--Modules/clinic/_collectionsmodule.c.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/Modules/clinic/_collectionsmodule.c.h b/Modules/clinic/_collectionsmodule.c.h
new file mode 100644
index 0000000..12626c1
--- /dev/null
+++ b/Modules/clinic/_collectionsmodule.c.h
@@ -0,0 +1,28 @@
+/*[clinic input]
+preserve
+[clinic start generated code]*/
+
+static PyObject *
+tuplegetter_new_impl(PyTypeObject *type, Py_ssize_t index, PyObject *doc);
+
+static PyObject *
+tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ PyObject *return_value = NULL;
+ Py_ssize_t index;
+ PyObject *doc;
+
+ if ((type == &tuplegetter_type) &&
+ !_PyArg_NoKeywords("_tuplegetter", kwargs)) {
+ goto exit;
+ }
+ if (!PyArg_ParseTuple(args, "nO:_tuplegetter",
+ &index, &doc)) {
+ goto exit;
+ }
+ return_value = tuplegetter_new_impl(type, index, doc);
+
+exit:
+ return return_value;
+}
+/*[clinic end generated code: output=83746071eacc28d3 input=a9049054013a1b77]*/