75 lines
2.4 KiB
Cython
75 lines
2.4 KiB
Cython
|
from cpython.array cimport array, clone
|
||
|
|
||
|
|
||
|
'''
|
||
|
These functions below, take a data element; if the data implements the
|
||
|
buffer interface, the data is returned unchanged, otherwise, a python
|
||
|
array is created from the data and returned.
|
||
|
|
||
|
in both cases, the second parameter is initialized with a pointer to the
|
||
|
starting address of the returned buffer
|
||
|
|
||
|
The return value is a tuple, of (original data, array), where in the first
|
||
|
case, array is None.
|
||
|
|
||
|
The method used below (a untyped python array + array.data.as_floats pointer)
|
||
|
results in the fastest list to array creation and usage. Even malloc isn't
|
||
|
faster. Note, using memoryview (which we avoided for this case) is relatively
|
||
|
slow in cython.
|
||
|
|
||
|
When the user passes in a memoryview type, we have no choice but to use the
|
||
|
memoryview passed in, though.
|
||
|
'''
|
||
|
cdef inline _ensure_float_view(data, float **f):
|
||
|
cdef array arr
|
||
|
cdef list src
|
||
|
cdef int i
|
||
|
cdef float [::1] memview
|
||
|
# do if/else instead of straight try/except because its faster for list
|
||
|
if not isinstance(data, (tuple, list)):
|
||
|
try:
|
||
|
memview = data
|
||
|
f[0] = &memview[0]
|
||
|
return data, None
|
||
|
except Exception as e:
|
||
|
import traceback; traceback.print_exc()
|
||
|
src = list(data)
|
||
|
arr = clone(array('f'), len(src), False)
|
||
|
f[0] = arr.data.as_floats
|
||
|
for i in range(len(src)):
|
||
|
f[0][i] = src[i]
|
||
|
else:
|
||
|
src = list(data)
|
||
|
arr = clone(array('f'), len(src), False)
|
||
|
f[0] = arr.data.as_floats
|
||
|
for i in range(len(src)):
|
||
|
f[0][i] = src[i]
|
||
|
return src, arr
|
||
|
|
||
|
|
||
|
cdef inline _ensure_ushort_view(data, unsigned short **f):
|
||
|
cdef array arr
|
||
|
cdef list src
|
||
|
cdef int i
|
||
|
cdef unsigned short [::1] memview
|
||
|
# do if/else instead of straight try/except because its faster for list
|
||
|
if not isinstance(data, (tuple, list)):
|
||
|
try:
|
||
|
memview = data
|
||
|
f[0] = &memview[0]
|
||
|
return data, None
|
||
|
except:
|
||
|
src = list(data)
|
||
|
arr = clone(array('H'), len(src), False)
|
||
|
f[0] = arr.data.as_ushorts
|
||
|
for i in range(len(src)):
|
||
|
f[0][i] = src[i]
|
||
|
else:
|
||
|
src = list(data)
|
||
|
arr = clone(array('H'), len(src), False)
|
||
|
f[0] = arr.data.as_ushorts
|
||
|
for i in range(len(src)):
|
||
|
f[0][i] = src[i]
|
||
|
return src, arr
|
||
|
|