Link Search Menu Expand Document
El Libro De Python (24.95 €) 39.95 €

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 de bool indicando si cada uno de los números introducidos es primo o no. Llámala desde Python.