Migliora il tuo codice Python con estensioni Rust

Migliora codice Python con estensioni Rust

Aumenta la velocità di ordini di grandezza ed aumenta la sicurezza del codice

Immagine dell'autore, generata usando DALLE

Come molti di voi già sanno, Python è un linguaggio di programmazione generico ottimizzato per la semplicità e la facilità d’uso. Sebbene sia uno strumento ottimo per compiti leggeri, la velocità di esecuzione del codice può diventare presto un ostacolo importante nei tuoi programmi.

In questo articolo, discuteremo perché Python è così lento, rispetto ad altri linguaggi di programmazione. Successivamente, vedremo come scrivere un’estensione di base in Rust per Python e confrontarne le prestazioni con un’implementazione nativa di Python.

Perché Python è lento

Prima di iniziare, vorrei sottolineare che i linguaggi di programmazione non sono intrinsecamente veloci o lenti: lo sono le loro implementazioni. Se vuoi saperne di più sulla differenza tra un linguaggio e la sua implementazione, leggi questo articolo:

Il mito del linguaggio di programmazione più veloce

Un comune fraintendimento di programmazione che deve essere eliminato

betterprogramming.pub

Innanzitutto, Python è un linguaggio con tipizzazione dinamica, il che significa che i tipi di variabili sono noti solo durante l’esecuzione, e non durante la compilazione. Sebbene questa scelta di progettazione consenta un codice più flessibile, l’interprete di Python non può fare supposizioni su quali siano le tue variabili e la loro dimensione. Di conseguenza, non può fare ottimizzazioni come farebbe un compilatore statico.

Un’altra scelta di progettazione che rende Python più lento rispetto ad altre alternative è il famigerato GIL. Il Global Interpreter Lock è un blocco mutex che consente a un solo thread di eseguire in un determinato momento. Il GIL era originariamente pensato per garantire la sicurezza dei thread, ma ha incontrato forti critiche da parte degli sviluppatori di applicazioni multithread.

Inoltre, il codice Python viene eseguito attraverso una macchina virtuale anziché essere eseguito direttamente sulla CPU. Questo ulteriore livello di astrazione aggiunge un significativo sovraccarico di esecuzione, rispetto ai linguaggi compilati staticamente.

Inoltre, gli oggetti Python vengono trattati internamente come dizionari (o hashmap) e i loro attributi (proprietà e metodi, accessibili tramite l’operatore punto) di solito non vengono accessi tramite un offset di memoria, ma…