Ho bisogno di accelerare una funzione. Dovrei usare Cython, ctypes, o qualcos'altro?

StackOverflow https://stackoverflow.com/questions/2647105

  •  27-09-2019
  •  | 
  •  

Domanda

Sto avendo un sacco di apprendimento divertente Python scrivendo un tipo di programmazione genetica di applicazione.

Ho avuto qualche ottimi consigli da Torsten Marek, Paul Hankin e Alex Martelli su questo sito.

Il programma dispone di 4 funzioni principali:

  • generare (in modo casuale) un albero di espressione.
  • valutare l'idoneità della struttura ad albero
  • incroci
  • mutare

Come tutti i generi, incrociare e call mutano 'di valutare l'idoneità'. è la funzione più attivo ed è il collo di bottiglia speedwise primaria.

Come è la natura degli algoritmi genetici, si deve cercare una soluzione spazio immenso in modo più veloce è il migliore. Voglio accelerare ciascuna di queste funzioni. Comincerò con il valutatore fitness. La mia domanda è che cosa è il modo migliore per farlo. Ho cercato in Cython, ctypes e 'Linking and Embedding'. Sono tutti nuovi per me e molto al di là di me in questo momento, ma non vedo l'ora di imparare uno e alla fine tutti loro.

La 'funzione di fitness' ha bisogno di confrontare il valore del albero di espressione per il valore dell'espressione di destinazione. Così sarà composto da un valutatore postfix, che leggerà l'albero in un ordine suffisso. Ho tutto il codice in Python.

Ho bisogno di un consiglio su cui dovrei imparare e utilizzare ora:. Cython, ctypes o Linking and Embedding

Grazie.

È stato utile?

Soluzione

Ignora risposta tutti elses' per ora. La prima cosa che si dovrebbe imparare a usare il profiler. Python viene fornito con un profilo / Cprofile; si dovrebbe imparare a leggere i risultati e analizzare dove i veri colli di bottiglia è. L'obiettivo di ottimizzazione è triplice:. Ridurre il tempo speso per ogni chiamata, ridurre il numero di chiamate da effettuare, e ridurre l'utilizzo della memoria per ridurre thrashing disco

Il primo obiettivo è relativamente facile. Il profiler vi mostrerà le maggior parte delle funzioni in termini di tempo e si può andare direttamente a quella funzione per ottimizzarlo.

Il secondo e il terzo gol è più difficile dal momento che questo significa che è necessario modificare l'algoritmo per ridurre la necessità di fare così tanto chiamate. Trova le funzioni che hanno elevato numero di chiamate e cercare di trovare modi per ridurre la necessità di chiamarli. Utilizzare il built-in collezioni, sono molto ben ottimizzato.

Se stai facendo un sacco di numero e l'elaborazione di array, si dovrebbe dare un'occhiata a panda, Numpy / SciPy, moduli di terze parti gmpy; che stanno ben ottimizzato librerie C per l'elaborazione di array di dati / tabulari.

Un'altra cosa che si vuole provare è PyPy. PyPy può JIT ricompilazione e fare molto di ottimizzazione più avanzato di CPython, e funzionerà senza la necessità di modificare il codice python. Anche se il codice ben ottimizzato mira CPython può apparire molto diverso da ben codice ottimizzato mira PyPy.

Avanti per provare è Cython. Cython è un linguaggio leggermente diverso rispetto Python, infatti Cython è in realtà meglio descritta come C con digitato Python-like sintassi.

Per le parti del codice che è in cicli molto stretti che non è più possibile ottimizzare utilizzando qualsiasi altro modo, si consiglia di riscriverlo come estensione C. Pitone ha un buon supporto per estendere con C. Nella PyPy, il modo migliore per estendere PyPy è con CFFI.

Altri suggerimenti

Cython è il più veloce per ottenere il lavoro fatto, sia scrivendo il vostro algoritmo direttamente in Cython, o scrivendo in C e associarlo al pitone con Cython.

Il mio consiglio:. Imparare Cython

Un altro grande opzione è boost :: python che consente di avvolgere facilmente C o C ++.

Di queste possibilità, però, dal momento che si dispone di codice python già scritto, Cython è probabilmente una buona cosa da provare prima. Forse non sarà necessario riscrivere tutto il codice per ottenere un aumento di velocità.

Prova a lavorare la funzione di fitness in modo che sosterrà Memoizzazione. Questo sostituirà tutte le chiamate che sono duplicati di chiamate precedenti con una ricerca dict rapida.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top