summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na92@gmail.com>2020-03-13 13:57:00 (GMT)
committerGitHub <noreply@github.com>2020-03-13 13:57:00 (GMT)
commit9ee88cde1abf7f274cc55a0571b1c2cdb1263743 (patch)
tree054a0854e660a4636136afe6c6158b94d8328589 /Objects
parent3f2f4fefca388bc62fc2a7d07cb6ef24197c84bd (diff)
downloadcpython-9ee88cde1abf7f274cc55a0571b1c2cdb1263743.zip
cpython-9ee88cde1abf7f274cc55a0571b1c2cdb1263743.tar.gz
cpython-9ee88cde1abf7f274cc55a0571b1c2cdb1263743.tar.bz2
bpo-37207: Use PEP 590 vectorcall to speed up tuple() (GH-18936)
Master: ./python.exe -m pyperf timeit "tuple((1, 2, 3, 4, 5))" Mean +- std dev: 361 ns +- 15 ns PEP-590: ./python.exe -m pyperf timeit "tuple((1, 2, 3, 4, 5))" Mean +- std dev: 203 ns +- 13 ns
Diffstat (limited to 'Objects')
-rw-r--r--Objects/tupleobject.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index 52ecb54..14ab53f 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -706,6 +706,26 @@ tuple_new_impl(PyTypeObject *type, PyObject *iterable)
}
static PyObject *
+tuple_vectorcall(PyObject *type, PyObject * const*args,
+ size_t nargsf, PyObject *kwnames)
+{
+ if (kwnames && PyTuple_GET_SIZE(kwnames) != 0) {
+ PyErr_Format(PyExc_TypeError, "tuple() takes no keyword arguments");
+ return NULL;
+ }
+ Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+ if (nargs > 1) {
+ PyErr_Format(PyExc_TypeError, "tuple() expected at most 1 argument, got %zd", nargs);
+ return NULL;
+ }
+
+ if (nargs) {
+ return tuple_new_impl((PyTypeObject *)type, args[0]);
+ }
+ return PyTuple_New(0);
+}
+
+static PyObject *
tuple_subtype_new(PyTypeObject *type, PyObject *iterable)
{
PyObject *tmp, *newobj, *item;
@@ -863,6 +883,7 @@ PyTypeObject PyTuple_Type = {
0, /* tp_alloc */
tuple_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
+ .tp_vectorcall = tuple_vectorcall,
};
/* The following function breaks the notion that tuples are immutable: