Dopo Python-cobol ho Incredibilmente scoperto Cython, un linguaggio di programmazione ibrido fra Python e C, in particolare lo scopo è quello di creare programmi Python richiamando all'evenienza funzioni C, quindi che consentono una maggiore efficienza di esecuzione.

Cython logo

Un benchmark di performance fra C, Python, PHP, JavaScript, MATLAB mostra chiaramente che C/C++ ha la massima efficienza, linguaggi interpretati come Python hanno grosse lacune quando si tratta di un notevole sforzo computazionale. Quindi Cython può essere una soluzione interessante per continuare a programmare in Python, sfruttando l'efficienza del C, all'occorrenza.

Installazione di Cython:

pip install cython

Per trovare la soluzione più ottimale, ho smanettato un pochino e suggerisco di seguire questi step:

  • creare un file, setup.py, che ci servirà dopo
  • creare un file, esempio.pyx, che è il file Cython: qui scriviamo funzioni, con una sintassi "mista" C/Python, quindi di fatto codice Python ma con la possibilità di gestione del tipo di variabili come nel C, ad esempio:
    def f(int x):
    return x*x
    print(f(3))
  • nel file setup.py scriviamo questo codice:
    from setuptools import setup
    from Cython.Build import cythonize
    setup(
        ext_modules = cythonize("esempio.pyx")
    )
  • da terminale scriviamo:
    python3 setup.py build_ext --inplace
  • vengono generati una serie di file, che lasciamo dove sono
  • ora da terminale possiamo scrivere:
    import esempio
    Viene eseguito il codice Cython, in questo caso la funzione f(3)=3*3 e stampato a video il risultato, 9.
  • ovviamente, se si modifica il file Cython, occorre compilare di nuovo, con il comando visto prima!

Conclusione: ho testato al volo Cython e comunque mi sembra interessante. Anche la documentazione è buona. L'idea di migliorare l'efficienza computazionale di Python, mantenendo la sintassi principale di Python, è una valida soluzione.

Magari a breve pubblichiamo un benchmark di performance fra Cython, C e Python, analogo a quanto fatto in precedenza con il confronto fra C, Python, MATLAB - GNU Octave, JavaScript, PHP.

Approfondimenti:
GitHub - Cython
Cython - tutorial
Unire C e Python nel modo migliore (no Cython)
Eseguire codice C in Python tramite CFFI

    Giulio_M un'alternativa al codice che migliora notevolmente le prestazioni, è quanto descritto in questo esempio.

    Anche in questo caso comunque, compilando il file Cython in modo esterno, come fatto finora e soprattutto definire i valori di pi_greco e Nepero anziché richiamarli dalla libreria Numpy, migliora di molto le performance.

    Compilando il file Cython come visto finora, anziché includerlo semplicemente come modulo nel file Python, migliora le prestazioni passando da 0,31 secondi a 0,28 secondi. Ricordiamo che facendo uso di Numpy, il tempo di esecuzione era di circa 2,95 secondi per Python puro e 2,2 secondi per Cython. Questo dunque è ciò che incide più di ogni cosa.

    2 anni dopo

    Cython vs CPython: non facciamo confusione!

    Ci tengo a fare questa precisazione, dato che la prima volta leggendo i termini mi stavo confondendo anche io. Cython e CPython assolutamente non sono sinonimi. Vediamo più in dettaglio:

    • CPython: implementazione di riferimento del linguaggio Python, quindi interprete e compilatore (il codice Python viene tradotto - compilato - in bytecode prima dell'interpretazione); di base funziona tramite global interpreter lock (GIL) in modo che un solo thread possa eseguire le operazioni (quindi funzionamento monocore, si perde il beneficio del multi-core) salvo approcci complessi, es. creare un interprete separato (GIL indipendente) per ogni thread (multiprocessing); CPython è progettato per essere compatibile molte piattaforme, librerie in linguaggio C
    • Cython: un linguaggio di programmazione noto come estensione di Python, una delle strade (una delle strade!) per aumenta l'efficienza computazionale, traducendo moduli Python in C, tramite una sintassi apposita ispirata al C; il codice compilato è ovviamente più veloce rispetto all'interpretazione diretta in CPython quindi per compiti computazionalmente pesanti (es. calcolo scientifico, analisi numerica) se si lavora in Python e non direttamente in C/C++, ad esempio, questa è comunque una valida soluzione per migliorare le prestazioni (varie librerie es. Scipy, Pandas integrano Cython)

    Powered by: FreeFlarum.
    (remove this footer)