update python3 for descargar python numpy cython lapack blas

python3 - Distribuir extensiones basadas en Cython usando LAPACK



python3 numpy (1)

Estoy escribiendo un módulo de Python que incluye extensiones de Cython y utiliza LAPACK (y BLAS ). Estoy abierto a usar ya sea clapack o lapacke , o algún tipo de solución f2c o f2py si es necesario. Lo que es importante es que puedo llamar a las rutinas de lapack y blas de Cython en bucles ajustados sin la sobrecarga de llamadas de Python.

Encontré un ejemplo here . Sin embargo, ese ejemplo depende de SAGE. Quiero que mi módulo sea instalable sin instalar SAGE, ya que no es probable que mis usuarios quieran o necesiten SAGE para nada más. Es probable que mis usuarios tengan instalados paquetes como numpy, scipy, pandas y scikit learn, por lo que serían dependencias razonables. ¿Cuál es la mejor combinación de interfaces para usar y cómo se vería el archivo setup.py mínimo que podría obtener la información necesaria (de numpy, scipy, etc.) para la compilación?

EDITAR: Esto es lo que terminé haciendo. Funciona en mi macbook, pero no tengo idea de lo portátil que es. Sin duda hay una mejor manera.

from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext import numpy from Cython.Build import cythonize from numpy.distutils.system_info import get_info # TODO: This cannot be the right way blas_include = get_info(''blas_opt'')[''extra_compile_args''][1][2:] includes = [blas_include,numpy.get_include()] setup( cmdclass = {''build_ext'': build_ext}, ext_modules = cythonize([Extension("cylapack", ["cylapack.pyx"], include_dirs = includes, libraries=[''blas'',''lapack'']) ]) )

Esto funciona porque, en mi macbook, el archivo de encabezado clapack.h está en el mismo directorio que cblas.h . Entonces puedo hacer esto en mi archivo pyx:

ctypedef np.int32_t integer cdef extern from "cblas.h": double cblas_dnrm2(int N,double *X, int incX) cdef extern from "clapack.h": integer dgelsy_(integer *m, integer *n, integer *nrhs, double *a, integer *lda, double *b, integer *ldb, integer * jpvt, double *rcond, integer *rank, double *work, integer * lwork, integer *info)


Si entendí la pregunta correctamente, podría utilizar los envoltorios Cython de SciPy para las rutinas BLAS y LAPACK. Estas envolturas están documentadas aquí:

Tal como lo indica la documentación, usted es responsable de verificar que las matrices que pase a estas funciones estén alineadas correctamente para las rutinas de Fortran. Simplemente puede importar y usar estas funciones según sea necesario en su archivo .pyx. Por ejemplo:

from scipy.linalg.cython_blas cimport dnrm2 from scipy.linalg.cython_lapack cimport dgelsy

Dado que este es un código ampliamente probado que se ejecuta en diferentes plataformas, diría que es un buen candidato para la distribución fiable de extensiones de Cython que llaman directamente a las rutinas BLAS y LAPACK.

Si no desea que su código tenga una dependencia en la totalidad de SciPy, aquí puede encontrar muchos de los archivos relevantes para estas funciones de contenedor en el directorio linalg de SciPy. Una referencia útil son estas líneas de setup.py que enumeran los archivos de fuente y encabezado. ¡Tenga en cuenta que se necesita un compilador Fortran!

En teoría , debería ser posible aislar solo los archivos fuente aquí que son necesarios para compilar los wrappers BLASS y LAPACK Cython y luego agruparlos como una extensión independiente con su módulo.

En la práctica esto es muy difícil de hacer. El proceso de compilación para el submódulo linalg requiere algunas funciones de Python para ayudar a la compilación en diferentes plataformas (por ejemplo, desde here ). Building también se basa en otros archivos fuente de C y Fortran ( here ), cuyas rutas están codificadas de forma rígida en estas funciones de Python.

Claramente, se ha trabajado mucho para asegurarnos de que SciPy se compila correctamente en diferentes sistemas operativos y arquitecturas.

Estoy seguro de que es posible hacerlo, pero después de mezclar archivos y modificar rutas, todavía no he encontrado la manera correcta de construir esta parte del submódulo de linalg independientemente del resto de SciPy. Si encuentro la forma correcta, me aseguraré de actualizar esta respuesta.