cover
Haz que tu código python sea más rápido con c++
image profile
Raúl Cobiellas
25 Dec 2023
Programaciónpython

Vamos hacer una función de ejemplo llamada

iterar
escrita usando solamente python que tomará un argumento que corresponde con la cantidad de iteraciones que se realizarán:

1# example.py 2 3def iterar(num: int): 4 """ 5 Args: 6 num (int): cantidad de iteraciones 7 8 Returns: 9 int: conteo final de las iteraciones realizadas 10 """ 11 12 conteo = 0 13 14 for n in range(num): 15 conteo += 1 16 17 return conteo 18 19 20resultado = iterar(100) 21 22print(resultado) # salida: 100 23

En este ejemplo se pasa como argumento el número

100
obteniendo el resultado casi al instante pero cuando aumentamos la iteraciones a
99999999
o a un número mayor vemos que se tarda bastante tiempo y si el número es suficientemente grande puede incluso llegar a tardarse minutos en obtener el resultado.

Aumentando la velocidad con c++

Para potenciar nuestro código python con c++ y que aumente la velocidad de respuesta en el caso que el número de iteraciones supere las

99999999
, vamos a crear un archivo llamado
iterar.cpp
con este contenido:

1// iterar.cpp 2 3 4extern "C" 5{ 6 // declarada la función iterar como una función externa de C. 7 int iterar(int num) 8 { 9 int conteo = 0; 10 for (int i = 0; i < num; i++) 11 { 12 conteo++; 13 }; 14 15 return conteo; 16 } 17}

Entonces una vez que compilemos este código con el siguiente comando obtendremos un archivo de biblioteca compartida (DLL en Windows o SO en Linux) :

1$ g++ -shared -o iterar.so iterar.cpp

Utilizando la biblioteca compartida

Después de compilar el código y generar la biblioteca compartida, puedes utilizar el siguiente código de Python para cargar y utilizar la biblioteca compartida utilizando ctypes.

1# iterar.py 2 3import ctypes 4 5# Cargamos la biblioteca compartida 6lib = ctypes.CDLL("./iterar.so") # Ruta a la biblioteca compartida 7 8# Definimos los tipos de argumentos y el tipo de retorno de la función 9lib.iterar.argtypes = (ctypes.c_int ,) 10lib.iterar.restype = ctypes.c_int 11 12# Llamamos a la función iterar y obtenemos el resultado 13result = lib.iterar(99999999) 14print(result) # Salida: 99999999

Ahora esta vez cuando ejecutemos nuestro código python y pasemos como argumento un número tal como

99999999
el resultado se obtendrá muchísimo antes que si utilizáramos solamente código python.