Reputation: 199
I have a Python program that needs to pass an array to a .dll that is expecting an array of c doubles. This is currently done by the following code, which is the fastest method of conversion I could find:
from array import array
from ctypes import *
import numpy as np
python_array = np.array(some_python_array)
temp = array('d', python_array.astype('float'))
c_double_array = (c_double * len(temp)).from_buffer(temp)
...where 'np.array' is just there to show that in my case the python_array is a numpy array. Let's say I now have two c_double arrays: c_double_array_a
and c_double_array_b
, the issue I'm having is I would like to append c_double_array_b
to c_double_array_a
without reconverting to/from whatever python typically uses for arrays. Is there a way to do this with the ctypes library?
I've been reading through the docs here but nothing seems to detail combining two c_type arrays after creation. It is very important in my program that they can be combined after creation, of course it would be trivial to just append python_array_b
to python_array_a
and then convert but that won't work in my case.
Thanks!
P.S. if anyone knows a way to speed up the conversion code that would also be greatly appreciated, it takes on the order of 150ms / million elements in the array and my program typically handles 1-10 million elements at a time.
Upvotes: 3
Views: 1118
Reputation: 39758
Leaving aside the construction of the ctypes
arrays (for which Mark's comment is surely relevant), the issue is that C arrays are not resizable: you can't append
or extend
them. (There do exist wrappers that provide these features, which may be useful references in constructing this.) What you can do is make a new array of the size of the two existing arrays together and then ctypes.memmove
them into it. It might be possible to improve the performance by using realloc
, but you'd have to go even lower than normal ctypes
memory management to use it.
Upvotes: 2