diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2013-07-29 10:35:43 -0700 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2013-07-29 10:35:43 -0700 |
commit | 32206dd79cafdce87cfb0db91903084c2fe2e473 (patch) | |
tree | 1be33dbfd0fc2e1ad8d743aff9d50d52d1171807 /numpy/core/src | |
parent | f9c225f2806adb195fbf3434b416746cdfb02c2c (diff) | |
parent | dde7ea5c65dae6fd0b4a3355faef0c8abf167325 (diff) | |
download | numpy-32206dd79cafdce87cfb0db91903084c2fe2e473.tar.gz |
Merge pull request #2941 from raulcota/avoid_create-kill_npscalars
Avoid conversion to NumPy Scalar
Diffstat (limited to 'numpy/core/src')
-rw-r--r-- | numpy/core/src/scalarmathmodule.c.src | 65 |
1 files changed, 61 insertions, 4 deletions
diff --git a/numpy/core/src/scalarmathmodule.c.src b/numpy/core/src/scalarmathmodule.c.src index 9247fc47a..307c7ddb0 100644 --- a/numpy/core/src/scalarmathmodule.c.src +++ b/numpy/core/src/scalarmathmodule.c.src @@ -663,19 +663,19 @@ static void /**begin repeat * #name = byte, ubyte, short, ushort, int, uint, * long, ulong, longlong, ulonglong, - * half, float, double, longdouble, + * half, float, longdouble, * cfloat, cdouble, clongdouble# * #type = npy_byte, npy_ubyte, npy_short, npy_ushort, npy_int, npy_uint, * npy_long, npy_ulong, npy_longlong, npy_ulonglong, - * npy_half, npy_float, npy_double, npy_longdouble, + * npy_half, npy_float, npy_longdouble, * npy_cfloat, npy_cdouble, npy_clongdouble# * #Name = Byte, UByte, Short, UShort, Int, UInt, * Long, ULong, LongLong, ULongLong, - * Half, Float, Double, LongDouble, + * Half, Float, LongDouble, * CFloat, CDouble, CLongDouble# * #TYPE = NPY_BYTE, NPY_UBYTE, NPY_SHORT, NPY_USHORT, NPY_INT, NPY_UINT, * NPY_LONG, NPY_ULONG, NPY_LONGLONG, NPY_ULONGLONG, - * NPY_HALF, NPY_FLOAT, NPY_DOUBLE, NPY_LONGDOUBLE, + * NPY_HALF, NPY_FLOAT, NPY_LONGDOUBLE, * NPY_CFLOAT, NPY_CDOUBLE, NPY_CLONGDOUBLE# */ @@ -720,6 +720,63 @@ _@name@_convert_to_ctype(PyObject *a, @type@ *arg1) /**end repeat**/ +/* Same as above but added exact checks against known python types for speed */ + +/**begin repeat + * #name = double# + * #type = npy_double# + * #Name = Double# + * #TYPE = NPY_DOUBLE# + * #PYCHECKEXACT = PyFloat_CheckExact# + * #PYEXTRACTCTYPE = PyFloat_AS_DOUBLE# + */ + +static int +_@name@_convert_to_ctype(PyObject *a, @type@ *arg1) +{ + PyObject *temp; + + if (@PYCHECKEXACT@(a)){ + *arg1 = @PYEXTRACTCTYPE@(a); + return 0; + } + + if (PyArray_IsScalar(a, @Name@)) { + *arg1 = PyArrayScalar_VAL(a, @Name@); + return 0; + } + else if (PyArray_IsScalar(a, Generic)) { + PyArray_Descr *descr1; + + if (!PyArray_IsScalar(a, Number)) { + return -1; + } + descr1 = PyArray_DescrFromTypeObject((PyObject *)Py_TYPE(a)); + if (PyArray_CanCastSafely(descr1->type_num, @TYPE@)) { + PyArray_CastScalarDirect(a, descr1, arg1, @TYPE@); + Py_DECREF(descr1); + return 0; + } + else { + Py_DECREF(descr1); + return -1; + } + } + else if (PyArray_GetPriority(a, NPY_PRIORITY) > NPY_PRIORITY) { + return -2; + } + else if ((temp = PyArray_ScalarFromObject(a)) != NULL) { + int retval = _@name@_convert_to_ctype(temp, arg1); + + Py_DECREF(temp); + return retval; + } + return -2; +} + +/**end repeat**/ + + /**begin repeat * #name = byte, ubyte, short, ushort, int, uint, * long, ulong, longlong, ulonglong, |