Estoy usando SWIG para unir código C++ a Python (2.6), y parte de ese pegamento incluye un código que convierte grandes campos de datos (millones de valores) del lado C++ a una matriz Numpy. El mejor método que se me ocurre con los aperos de un iterador para la clase y luego se proporciona un método de Python:Conversión rápida del vector C/C++ al array Numpy
def __array__(self, dtype=float):
return np.fromiter(self, dtype, self.size())
El problema es que cada llamada iterador next
es muy costoso, ya que tiene que pasar por unos tres o cuatro Envoltorios SWIG. Toma demasiado tiempo. Puedo garantizar que los datos de C++ se almacenan de forma contigua (ya que viven en un std :: vector), y parece que Numpy debería poder llevar un puntero al principio de esos datos junto con la cantidad de valores que contiene, y léelo directamente.
¿Hay alguna manera de pasar un puntero a internal_data_[0]
y el valor internal_data_.size()
a numpy para que pueda acceder directamente o copiar los datos sin toda la sobrecarga de Python?
¿Puede proporcionar un poco más de detalle para una implementación práctica? ¿Existe también una forma de hacerlo sin tener que compilar mi proyecto con los archivos de encabezado de Numpy? Gracias. –
también dice que es una interfaz heredada. –
'__array_interface__' es simplemente un dict simple con tipos simples dentro de él. No es necesario compilar con ningún encabezado Numpy. Ignora la nota que lo llama "legado". Pensé que ya había eliminado eso. Si lo desea, puede implementar la interfaz de búfer PEP 3118, pero esto es más fácil. –