Accélérer le code Python avec C (et pas de bibliothèques supplémentaires)

WBOY
Libérer: 2024-08-21 15:47:02
original
1013 Les gens l'ont consulté

REMARQUE : Publié à l'origine dans mon sous-stack : https://open.substack.com/pub/andresalvareziglesias/p/speeding-up-python-code-with-c-and

Python n'est pas le paradigme de la vitesse, nous le savons tous. Mais nous pouvons accélérer certaines parties critiques de nos applications avec l'aide de notre bon vieil ami C.

Speeding up Python code with C (and no extra libraries)

La séquence de Fibonacci en Python simple

La séquence de Fibonacci est un exemple classique utilisé pour enseigner le développement de logiciels. Est une série de nombres commençant par 0 et 1. Chaque nombre suivant est la somme des deux précédents. Ainsi, la séquence ressemble à ceci : 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

Nous pouvons développer Fibonacci en python de cette manière :

import time

# Configure iterations
iterations = 30

# Define fibonacci in native python
def fibonacci(n):
  if n <= 1:
    return n
  else:
    return fibonacci(n-1) + fibonacci(n-2)

# Calculate in pure python
start_time = time.perf_counter()
print(f"Calculating {iterations} iterations of fibonacci...")
print(fibonacci(iterations))
end_time = time.perf_counter()
execution_time_ms = (end_time - start_time) * 1000
print(f"Execution time: {execution_time_ms:.2f} milliseconds")
print()
Copier après la connexion

Si nous exécutons cette version pure Python (dans une machine virtuelle Google IDX) de Fibonacci, nous obtenons :

  • 10 itérations : 5,77 millisecondes
  • 30 itérations : 984,36 millisecondes
  • 50 itérations : (je dois annuler le processus, trop de temps)

La suite de Fibonacci en C

On peut développer la même séquence en simple C :

#include <stdio.h>

int fibonacci(int n) {
    if (n <= 1) {
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
Copier après la connexion

Compilez la bibliothèque avec GCC :

gcc -o fibonacci.so -shared -fPIC -O2 fibonacci.c
Copier après la connexion

Maintenant, nous avons une bibliothèque binaire native avec la fonction de séquence de Fibonacci à l'intérieur. Nous pouvons intégrer cette bibliothèque dans une application Python avec ctypes (la bibliothèque de types Python C, car Python lui-même est développé en C) :

import time
from ctypes import c_double, c_int, CDLL

# Configure iterations
iterations = 30

# Import the C library
library = CDLL('./fibonacci.so')
fibonacciAsLibrary = library.fibonacci
fibonacciAsLibrary.restype = c_int

# Calculate as C library
start_time = time.perf_counter()
print(f"Calculating {iterations} iterations of fibonacci as C library...")
print(fibonacciAsLibrary(iterations))
end_time = time.perf_counter()
execution_time_ms = (end_time - start_time) * 1000
print(f"Execution time: {execution_time_ms:.2f} milliseconds")
print()
Copier après la connexion

Maintenant, si on exécute cette version sur Fibonacci, on obtient :

  • 10 itérations : 0,54 millisecondes
  • 30 itérations : 6,92 millisecondes
  • 50 itérations : 82324,90 millisecondes

Mieux, n'est-ce pas ?

Cas d'utilisation pour l'intégration Python et C

Nous pouvons utiliser ce type d'intégration dans de nombreuses applications et scénarios, comme :

  • Accélérez les sérialiseurs et désérialiseurs dans notre application Django
  • Accélérez les parties critiques d'un flux de travail
  • Interactions de bas niveau avec le système d'exploitation
  • Etc.

Et vous ? Comment allez-vous utiliser cette petite astuce dans votre projet ? J'adorerais entendre vos commentaires !

À propos de la liste

Parmi les articles Python et Docker, j'écrirai également sur d'autres sujets connexes (toujours des sujets de technologie et de programmation, promis... en croisant les doigts), comme :

  • Architecture logicielle
  • Environnements de programmation
  • Système d'exploitation Linux
  • Etc.

Si vous avez trouvé une technologie, un langage de programmation ou autre intéressant, n'hésitez pas à me le faire savoir ! Je suis toujours ouvert à apprendre quelque chose de nouveau !

À propos de l'auteur

Je m'appelle Andrés, un développeur de logiciels full-stack basé à Palma, en quête personnelle d'amélioration de mes compétences en codage. Je suis également un écrivain fantastique auto-publié avec quatre romans publiés à mon actif. N'hésitez pas à me demander n'importe quoi !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal