2010-11-15 3 views
5

Ho un sistema attualmente scritto in Python che può essere separato nei livelli backend e frontend. Python è troppo lento, quindi voglio riscrivere il backend in un linguaggio veloce compilato mantenendo il frontend in Python, in un modo che consente di chiamare la funzionalità back-end da Python. Quali sono le migliori scelte per farlo?Scelte linguistiche per scrivere astrazioni molto veloci che si interfacciano con Python?

Ho preso in considerazione il cython ma è molto limitato e scomodo da scrivere, e non molto più velocemente. Da quello che ricordo di Boost Python per C++, è molto fastidioso mantenere il ponte tra le lingue. Ci sono scelte migliori?

miei principali fattori sono:

  • velocità di esecuzione
  • velocità di compilazione
  • lingua è dichiarativo
+2

Come pensi che Cython non sia molto più veloce? Stai dichiarando i tipi? Ecco dove è la maggiore accelerazione. – aaronasterling

+0

Cython, infatti è uno strumento molto utile per integrare python e "c code". Non è affatto ingombrante. Semplicemente, scrivi quelle funzioni che aiuterebbero l'accelerazione e le espongono come libreria usando cython. – pyfunc

risposta

7

C++ con SWIG in grado di generare tutto il codice collante necessario. Finché si evitano salti eccessivi tra C++ e python, sarà veloce quanto il C++. Le interfacce SWIG sono in genere abbastanza semplici da generare a meno che non si stia facendo qualcosa di "strano".

+1

+1 Raccomando anche SWIG. È _molto_ facile da usare. Le funzioni non supportate sono ** 1/** Versioni sovraccaricate di determinati operatori (nuovi, eliminati, ecc.) ** 2/** Classi annidate e poche altre cose, ma esistono soluzioni alternative e riceverai avvertimenti chiari. – log0

2

Se si utilizzava Jython, è possibile chiamare le routine di backend Java in modo semplice (banalmente). Java è circa due volte più lento di c e 10 volte più veloce di Python l'ultima volta che ho controllato.

+0

Il problema è che l'ultima volta che ho controllato, jython stava usando una versione abbastanza antiquata di python. Dispone ancora di gestori di contesto? – aaronasterling

+0

@aaronasterling - In effetti è una vecchia versione, 2.5.2rc2 è l'ultima versione. Ha dei gestori di contesto (ne ho una copia installata in questo momento), ma mancano ancora molte funzionalità incluse in 2.6 e 2.7, abbastanza che preferisco occuparmi del mantenimento dei binding boost-python piuttosto che usare un rilascio che è così vecchio . : D –

1

Non sarei d'accordo su Boost :: Python. Lo può diventare ingombrante quando si avvolge una libreria C++ centrica esistente e si prova a non modificare l'interfaccia. Ma non è quello che stai cercando di fare.

Stai cercando di spingere il pesante sollevamento di una soluzione Python esistente in un linguaggio più veloce. Ciò significa che puoi controllare l'interfaccia.

Se si è in controllo dell'interfaccia, si può conservare python-friendly, e BP-friendly (IE: Evitare le cose problematici come puntatori e tipi immutabili come L-valori)

In tal caso, Boost :: Python può essere semplice come dirgli quali funzioni vuoi chiamare da python.

Problemi correlati