Использование ctypes
или Cython для обёртывания ваших функций на C - определенно лучший способ.Таким образом, вам даже не нужно будет копировать данные между кодом C и Python - и C, и часть Python выполняются в одном и том же процессе и имеют доступ к одним и тем же данным.Давайте придерживаться ctypes
, так как это то, что вы предложили.Кроме того, использование NumPy сделает это намного удобнее.
Я предполагаю, что ваш тип vertex
выглядит следующим образом:
typedef struct
{
int index;
float x, y;
} vertex;
Чтобы иметь эти вершины в массиве NumPy, вы можете определитьзапись "dtype" для него:
vertex_dtype = [('index', 'i'), ('x', 'f'), ('y', 'f')]
Также определите этот тип как ctypes
структуру:
class Vertex(ctypes.Structure):
_fields_ = [("index", ctypes.c_int),
("x", ctypes.c_float),
("y", ctypes.c_float)]
Теперь прототип ctypes
для вашей функции find_vertex()
будет выглядеть так:
from numpy.ctypeslib import ndpointer
lib = ctypes.CDLL(...)
lib.find_vertex.argtypes = [ndpointer(dtype=vertex_dtype, flags="C_CONTIGUOUS"),
ctypes.c_int,
ctypes.POINTER(Vertex),
ctypes.POINTER(Vertex)]
lib.find_vertex.restypes = None
Чтобы вызвать эту функцию, создайте массив вершин NumPy
vertices = numpy.empty(1000, dtype=vertex_dtype)
и две структуры для возвращаемых значений
lower = Vertex()
higher = Vertex()
и, наконец, вызовите вашу функцию:
lib.find_vertex(vertices, len(vertices), lower, higher)
NumPy и ctypes
позаботятся о передаче указателя на начало данных vertices
в вашу функцию C - копирование не требуется.
Возможно, вам придется прочитать немного документации по ctypes
и NumPy, но я надеюсь, что этот ответ поможет вам начать работу с ним.