diff options
author | Dong-hee Na <donghee.na92@gmail.com> | 2020-03-13 13:57:00 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-13 13:57:00 (GMT) |
commit | 9ee88cde1abf7f274cc55a0571b1c2cdb1263743 (patch) | |
tree | 054a0854e660a4636136afe6c6158b94d8328589 | |
parent | 3f2f4fefca388bc62fc2a7d07cb6ef24197c84bd (diff) | |
download | cpython-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
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2020-03-12-02-41-12.bpo-37207.ye7OM3.rst | 2 | ||||
-rw-r--r-- | Objects/tupleobject.c | 21 |
2 files changed, 23 insertions, 0 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-03-12-02-41-12.bpo-37207.ye7OM3.rst b/Misc/NEWS.d/next/Core and Builtins/2020-03-12-02-41-12.bpo-37207.ye7OM3.rst new file mode 100644 index 0000000..ecbadf9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-03-12-02-41-12.bpo-37207.ye7OM3.rst @@ -0,0 +1,2 @@ +Speed up calls to ``tuple()`` by using the :pep:`590` ``vectorcall`` calling +convention. Patch by Dong-hee Na. 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: |