https://github.com/python/cpython/commit/6ee879ffa1cbea78b0a0c4eff7e532fd6a2959ac
commit: 6ee879ffa1cbea78b0a0c4eff7e532fd6a2959ac
branch: main
author: Pieter Eendebak <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2026-05-18T12:07:12+05:30
summary:
gh-138325: steal list items in `INTRINSIC_LIST_TO_TUPLE` opcode (#149960)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2026-05-17-12-00-00.gh-issue-138325.h2XSfe.rst
M Python/intrinsics.c
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2026-05-17-12-00-00.gh-issue-138325.h2XSfe.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-17-12-00-00.gh-issue-138325.h2XSfe.rst
new file mode 100644
index 00000000000000..0eb528c68d8d6f
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-17-12-00-00.gh-issue-138325.h2XSfe.rst
@@ -0,0 +1,3 @@
+Speed up converting a list to a tuple in the ``tuple(genexpr)`` fast path
+and in starred tuple displays (e.g. ``(*a, *b)``) by stealing the list's
+items into the tuple instead of copying them.
diff --git a/Python/intrinsics.c b/Python/intrinsics.c
index 9cfc285c6a5925..9f994950f2721d 100644
--- a/Python/intrinsics.c
+++ b/Python/intrinsics.c
@@ -7,6 +7,8 @@
#include "pycore_genobject.h" // _PyAsyncGenValueWrapperNew
#include "pycore_interpframe.h" // _PyFrame_GetLocals()
#include "pycore_intrinsics.h" // INTRINSIC_PRINT
+#include "pycore_list.h" // _PyList_AsTupleAndClear()
+#include "pycore_object.h" // _PyObject_IsUniquelyReferenced()
#include "pycore_pyerrors.h" // _PyErr_SetString()
#include "pycore_runtime.h" // _Py_ID()
#include "pycore_typevarobject.h" // _Py_make_typevar()
@@ -190,8 +192,12 @@ unary_pos(PyThreadState* unused, PyObject *value)
static PyObject *
list_to_tuple(PyThreadState* unused, PyObject *v)
{
- assert(PyList_Check(v));
- return PyTuple_FromArray(((PyListObject *)v)->ob_item, Py_SIZE(v));
+ /* INTRINSIC_LIST_TO_TUPLE is only emitted by the compiler for a
+ freshly-built, uniquely-referenced temporary list, so steal its items
+ into the tuple instead of copying them. */
+ assert(PyList_CheckExact(v));
+ assert(_PyObject_IsUniquelyReferenced(v));
+ return _PyList_AsTupleAndClear((PyListObject *)v);
}
static PyObject *
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]