Speed-up math.dist() by 30% (GH-9628)

This commit is contained in:
Raymond Hettinger 2018-09-29 14:30:38 -07:00 committed by GitHub
parent e45473e3ca
commit df8101517a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 6 deletions

View File

@ -294,8 +294,9 @@ math_dist(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
PyObject *p; PyObject *p;
PyObject *q; PyObject *q;
if (!_PyArg_ParseStack(args, nargs, "O!O!:dist", if (!_PyArg_UnpackStack(args, nargs, "dist",
&PyTuple_Type, &p, &PyTuple_Type, &q)) { 2, 2,
&p, &q)) {
goto exit; goto exit;
} }
return_value = math_dist_impl(module, p, q); 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: exit:
return return_value; return return_value;
} }
/*[clinic end generated code: output=d936137c1189b89b input=a9049054013a1b77]*/ /*[clinic end generated code: output=239c51a5acefbafb input=a9049054013a1b77]*/

View File

@ -2101,8 +2101,8 @@ vector_norm(Py_ssize_t n, double *vec, double max, int found_nan)
/*[clinic input] /*[clinic input]
math.dist math.dist
p: object(subclass_of='&PyTuple_Type') p: object
q: object(subclass_of='&PyTuple_Type') q: object
/ /
Return the Euclidean distance between two points p and q. Return the Euclidean distance between two points p and q.
@ -2116,7 +2116,7 @@ Roughly equivalent to:
static PyObject * static PyObject *
math_dist_impl(PyObject *module, PyObject *p, PyObject *q) 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; PyObject *item;
double max = 0.0; 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_on_stack[NUM_STACK_ELEMS];
double *diffs = diffs_on_stack; 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); m = PyTuple_GET_SIZE(p);
n = PyTuple_GET_SIZE(q); n = PyTuple_GET_SIZE(q);
if (m != n) { if (m != n) {