[Python-checkins] cpython: Issue #27128: _pickle uses fast call

victor.stinner python-checkins at python.org
Fri Aug 19 13:01:22 EDT 2016


https://hg.python.org/cpython/rev/3ab32f7add6e
changeset:   102781:3ab32f7add6e
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Fri Aug 19 18:59:15 2016 +0200
summary:
  Issue #27128: _pickle uses fast call

Use _PyObject_FastCall() to avoid the creation of temporary tuple.

files:
  Modules/_pickle.c |  19 ++++---------------
  1 files changed, 4 insertions(+), 15 deletions(-)


diff --git a/Modules/_pickle.c b/Modules/_pickle.c
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -345,7 +345,6 @@
 _Pickle_FastCall(PyObject *func, PyObject *obj)
 {
     PyObject *result;
-    PyObject *arg_tuple = PyTuple_New(1);
 
     /* Note: this function used to reuse the argument tuple. This used to give
        a slight performance boost with older pickle implementations where many
@@ -358,13 +357,8 @@
        significantly reduced the number of function calls we do. Thus, the
        benefits became marginal at best. */
 
-    if (arg_tuple == NULL) {
-        Py_DECREF(obj);
-        return NULL;
-    }
-    PyTuple_SET_ITEM(arg_tuple, 0, obj);
-    result = PyObject_Call(func, arg_tuple, NULL);
-    Py_CLEAR(arg_tuple);
+    result = _PyObject_FastCall(func, &obj, 1, NULL);
+    Py_DECREF(obj);
     return result;
 }
 
@@ -1157,9 +1151,7 @@
         return -1;
 
     if (n == READ_WHOLE_LINE) {
-        PyObject *empty_tuple = PyTuple_New(0);
-        data = PyObject_Call(self->readline, empty_tuple, NULL);
-        Py_DECREF(empty_tuple);
+        data = _PyObject_FastCall(self->readline, NULL, 0, NULL);
     }
     else {
         PyObject *len;
@@ -3956,10 +3948,7 @@
             /* Check for a __reduce__ method. */
             reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
             if (reduce_func != NULL) {
-                PyObject *empty_tuple = PyTuple_New(0);
-                reduce_value = PyObject_Call(reduce_func, empty_tuple,
-                                             NULL);
-                Py_DECREF(empty_tuple);
+                reduce_value = _PyObject_FastCall(reduce_func, NULL, 0, NULL);
             }
             else {
                 PyErr_Format(st->PicklingError,

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list