-
-
Notifications
You must be signed in to change notification settings - Fork 104
Description
The function _check_ctypeslib_typecodes() in _npsupport.py returns a dictionary that is also assigned to ctypeslib._typecodes. The dictionary maps numpy dtype string representations ('i4', 'f8', etc.) to ctypes classes. The ctypeslib._typecodes dictionary appears correct and is used by _get_elements_raw() in safearray.py on line 325. The _get_elements_raw() function is part of the implementation of the "with safearray_as_ndarray:" context manager to optimize the transfer/conversion of safearrays/ndarrays.
However, _get_elements_raw() uses the keys() field of ctypeslib._typecodes to determine if the particular ctype is supported. The conditional is:
if safearray_as_ndarray and self._itemtype_ in list(
comtypes.npsupport.typecodes.keys()
):
This appears incorrect, since the self.itemtype is a ctype, not a dtype as returned by comtypes.npsupport.typecodes.keys(). The end result is "with safearray_as_ndarray:" is essentially ignored with no speed up. Changing the conditional to:
if safearray_as_ndarray and self._itemtype_ in list(
comtypes.npsupport.typecodes.values()
):
works as expected, with an array transfer speed increase of up to 6x on my system. The keys() bug first appeared in release 1.13 and persists in 1.4.2. Using the simple change:
comtypes.npsupport.typecodes.values()
enables "with safearray_as_ndarray:" to work as intended and also passes all the unit tests.