From df8101517aa1c917fdf8aeb466e480c26d4e878c Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 29 Sep 2018 14:30:38 -0700 Subject: [PATCH] Speed-up math.dist() by 30% (GH-9628) --- Modules/clinic/mathmodule.c.h | 7 ++++--- Modules/mathmodule.c | 11 ++++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index c4d27863410..b40a227dbea 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -294,8 +294,9 @@ math_dist(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *p; PyObject *q; - if (!_PyArg_ParseStack(args, nargs, "O!O!:dist", - &PyTuple_Type, &p, &PyTuple_Type, &q)) { + if (!_PyArg_UnpackStack(args, nargs, "dist", + 2, 2, + &p, &q)) { goto exit; } return_value = math_dist_impl(module, p, q); @@ -522,4 +523,4 @@ math_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject exit: return return_value; } -/*[clinic end generated code: output=d936137c1189b89b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=239c51a5acefbafb input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index e872e473f5f..e956314e27f 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2101,8 +2101,8 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan) /*[clinic input] math.dist - p: object(subclass_of='&PyTuple_Type') - q: object(subclass_of='&PyTuple_Type') + p: object + q: object / Return the Euclidean distance between two points p and q. @@ -2116,7 +2116,7 @@ Roughly equivalent to: static PyObject * math_dist_impl(PyObject *module, PyObject *p, PyObject *q) -/*[clinic end generated code: output=56bd9538d06bbcfe input=937122eaa5f19272]*/ +/*[clinic end generated code: output=56bd9538d06bbcfe input=8c83c07c7a524664]*/ { PyObject *item; double max = 0.0; @@ -2126,6 +2126,11 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q) double diffs_on_stack[NUM_STACK_ELEMS]; double *diffs = diffs_on_stack; + if (!PyTuple_Check(p) || !PyTuple_Check(q)) { + PyErr_SetString(PyExc_TypeError, "dist argument must be a tuple"); + return NULL; + } + m = PyTuple_GET_SIZE(p); n = PyTuple_GET_SIZE(q); if (m != n) {