Squash a few calls to the hideously expensive PyObject_CallObject(o,a)
-- replace then with slightly faster PyObject_Call(o,a,NULL).  (The
difference is that the latter requires a to be a tuple; the former
allows other values and wraps them in a tuple if necessary; it
involves two more levels of C function calls to accomplish all that.)
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index c3c5893..a12e7df 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3257,7 +3257,7 @@
 static int
 slot_nb_nonzero(PyObject *self)
 {
-	PyObject *func, *res;
+	PyObject *func, *res, *args;
 	static PyObject *nonzero_str, *len_str;
 
 	func = lookup_maybe(self, "__nonzero__", &nonzero_str);
@@ -3272,7 +3272,11 @@
 				return 1;
 		}
 	}
-	res = PyObject_CallObject(func, NULL);
+	args = res = PyTuple_New(0);
+	if (args != NULL) {
+		res = PyObject_Call(func, args, NULL);
+		Py_DECREF(args);
+	}
 	Py_DECREF(func);
 	if (res == NULL)
 		return -1;
@@ -3651,9 +3655,14 @@
 
 	func = lookup_method(self, "__iter__", &iter_str);
 	if (func != NULL) {
-		 res = PyObject_CallObject(func, NULL);
-		 Py_DECREF(func);
-		 return res;
+		PyObject *args;
+		args = res = PyTuple_New(0);
+		if (args != NULL) {
+			res = PyObject_Call(func, args, NULL);
+			Py_DECREF(args);
+		}
+		Py_DECREF(func);
+		return res;
 	}
 	PyErr_Clear();
 	func = lookup_method(self, "__getitem__", &getitem_str);