[Python-checkins] bpo-43287: Use PEP 590 vectorcall to speed up filter() (GH-24611)

corona10 webhook-mailer at python.org
Wed Mar 10 11:40:03 EST 2021


https://github.com/python/cpython/commit/9a9c11ad41d7887f3d6440e0f0e8966156d959b5
commit: 9a9c11ad41d7887f3d6440e0f0e8966156d959b5
branch: master
author: Dong-hee Na <donghee.na at python.org>
committer: corona10 <donghee.na92 at gmail.com>
date: 2021-03-11T01:39:52+09:00
summary:

bpo-43287: Use PEP 590 vectorcall to speed up filter() (GH-24611)

files:
A Misc/NEWS.d/next/Core and Builtins/2021-02-22-03-01-02.bpo-43287.aTs6fO.rst
M Python/bltinmodule.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-22-03-01-02.bpo-43287.aTs6fO.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-22-03-01-02.bpo-43287.aTs6fO.rst
new file mode 100644
index 0000000000000..d8d5b2f2a9ceb
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-22-03-01-02.bpo-43287.aTs6fO.rst	
@@ -0,0 +1,2 @@
+Speed up calls to ``filter()`` by using the :pep:`590` ``vectorcall``
+calling convention. Patch by Dong-hee Na.
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index dec2984a068df..52591c4a46f3d 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -533,8 +533,40 @@ filter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
         Py_DECREF(it);
         return NULL;
     }
-    Py_INCREF(func);
-    lz->func = func;
+
+    lz->func = Py_NewRef(func);
+    lz->it = it;
+
+    return (PyObject *)lz;
+}
+
+static PyObject *
+filter_vectorcall(PyObject *type, PyObject * const*args,
+                size_t nargsf, PyObject *kwnames)
+{
+    PyTypeObject *tp = (PyTypeObject *)type;
+    if (tp == &PyFilter_Type && !_PyArg_NoKwnames("filter", kwnames)) {
+        return NULL;
+    }
+
+    Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
+    if (!_PyArg_CheckPositional("filter", nargs, 2, 2)) {
+        return NULL;
+    }
+
+    PyObject *it = PyObject_GetIter(args[1]);
+    if (it == NULL) {
+        return NULL;
+    }
+
+    filterobject *lz = (filterobject *)tp->tp_alloc(tp, 0);
+
+    if (lz == NULL) {
+        Py_DECREF(it);
+        return NULL;
+    }
+
+    lz->func = Py_NewRef(args[0]);
     lz->it = it;
 
     return (PyObject *)lz;
@@ -653,6 +685,7 @@ PyTypeObject PyFilter_Type = {
     PyType_GenericAlloc,                /* tp_alloc */
     filter_new,                         /* tp_new */
     PyObject_GC_Del,                    /* tp_free */
+    .tp_vectorcall = (vectorcallfunc)filter_vectorcall
 };
 
 



More information about the Python-checkins mailing list