Usar código C con cffi
En este ejemplo vemos como usar código C desde Python, gracias a cffi
. Este paquete permite a Python actuar como wrapper de código escrito en C.
Por ejemplo, podemos escribir una función en C y exponerla para que pueda ser llamada desde Python. Esto puede ser útil cuando queramos la velocidad de C pero la simplicidad de Python. Hay de hecho muchos paquetes de Python que aunque tu veas código Python, por debajo el código es C. Por ejemplo, en numpy
.
Por un lado definimos un código en C. Este es el código que queremos llamar desde Python. Creamos una función para determinar si un número es primo o no.
// mylib.c
#include <stdbool.h>
#include <math.h>
bool es_primo(int n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0 || n % 3 == 0) return false;
int limit = sqrt(n);
for (int i = 5; i <= limit; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
Ahora usamos cffi
. Primero debemos compilar nuestro código en C para que pueda ser usado por Python. Esto solo hay que hacerlo una vez. Fíjate en el compile
.
import cffi
import os
if not os.path.exists("mylib.o"):
ffi = cffi.FFI()
ffi.cdef("bool es_primo(int n);")
ffi.set_source(
"_mylib",
'#include "mylib.c"')
ffi.compile()
Una vez lo tenemos, podemos importar la librería y usar es_primo
. El código que se ejecutará por debajo será el código C compilado. Pero en realidad lo que estás usando es código Python.
import _mylib
numero = 777
primo = _mylib.lib.es_primo(numero)
print(f"El {numero}{'' if primo else ' no'} es primo")
✏️ Ejercicios:
- Crea una función en C
son_primos
que dada una lista de números devuelva otra lista debool
indicando si cada uno de los números introducidos es primo o no. Llámala desde Python.