2011-12-30 8 views
9

Sto sviluppando un'applicazione C++ che si estende/script con Python. Ovviamente C++ è molto più veloce di Python, in generale, ma ciò significa necessariamente che dovresti preferire l'esecuzione di codice C++ su codice Python il più spesso possibile?Prezzo di passare il controllo tra C++ e Python

sto chiedendo questo perché non sono sicuro, non v'è alcun costo di prestazione di controllo della commutazione tra il codice scritto in C++ e il codice scritto in Python? Dovrei usare il codice scritto in C++ in ogni occasione, o dovrei evitare di richiamare in C++ per compiti semplici perché qualsiasi guadagno di velocità che potresti avere dall'esecuzione del codice C++ è superato dal costo del passaggio da una lingua all'altra?

Modifica: Devo chiarire questo, non sto chiedendo questo per risolvere effettivamente un problema. Sto chiedendo solo per curiosità ed è qualcosa che vale la pena tenere a mente per il futuro. Quindi non sono interessato a soluzioni alternative, voglio solo sapere la risposta, dal punto di vista tecnico. :)

+0

È un'opzione per scrivere l'applicazione principale in Python e usare C++ per scrivere un modulo Python che l'applicazione può utilizzare? Quindi il costo di cambiare lingua dovrebbe essere zero. –

risposta

1

Il costo è presente ma trascurabile. Questo perché probabilmente fai un bel po 'di lavoro convertendo i datatype di alto livello di Python in rappresentazioni compatibili con C++. Ovviamente questo è simile al costo di chiamare una funzione C++ da un'altra, c'è un sovraccarico. Le regole per quando è una buona idea per passare in pitone a C++ sono:

Una funzione con alcuni argomenti

Una funzione che fa una grande quantità di elaborazione su una piccola quantità di dati

una funzione che si chiama il meno possibile - funzione di consolidare le chiamate se possibile

+1

In ordine: 1. che cosa c'entra il numero di argomenti con qualcosa? 2. Che dire di una grande quantità di elaborazione su una grande quantità di dati? Non può farlo C++? 3: Se viene chiamato di rado, perché mai dovresti affrontare l'enorme sforzo di convertirlo in C++? Sembra che dovresti concentrarti su quelli che effettivamente consumano i tempi di elaborazione. –

+1

@Chris: 1. Come dice Dan, di solito è piuttosto maldestro accedere agli argomenti da un interprete. Se avessi bisogno di una funzione che prendesse un centinaio di argomenti numerici solo per restituire la somma, non avrebbe molto senso chiamare attraverso un'implementazione in C++. Lo stesso concetto guida "large ... processing ... small ... data" - se riesci a passare il codice C++ con meno argomenti (anche se si tratta di array di grandi dimensioni) e sta facendo qualcosa di complesso come dire il riconoscimento ottico dei caratteri sui dati allora è molto probabile che valga la pena implementare/chiamare in C++. –

+1

@Chris: 3. "raramente come _possibile_" - diciamo ognuno di miliardi di passaggi attraverso un ciclo stretto necessario per applicare una strana, complessa funzione matematica a 20 valori. Considera il consolidamento delle chiamate C++ in modo che una chiamata in C++ riceva tutti i 20 valori contemporaneamente, restituendo i risultati insieme. –

0

Il miglior metrica dovrebbe essere qualcosa che wieghs per voi ....

  • rende lo sviluppo, il debug e test più facile (abbassa costo dev)
  • abbassa il costo di manutenzione
  • soddisfa il requisito di prestazione (fornisce la soluzione)
7

non so c'è una regola concreta per questo, ma una regola generale che molti seguire è quello di:

  • Prototipo in python. Questo è più veloce da scrivere e può essere più facile da leggere/ragionare.
  • Una volta che hai un prototipo, è ora possibile identificare le porzioni lente che dovrebbe essere scritto in C++ (mediante profilatura).
  • seconda del dominio del codice, i bit lenti sono generalmente isolati ai tipi 'anello interno' di codice, in modo che il numero di interruttori tra pitone un tale codice dovrebbe essere relativamente piccola.
  • Se il programma è sufficientemente veloce, hai evitato con successo ottimizzare prematuramente il codice scrivendo troppo in C++.
+1

Questo è polarizzato, come se ogni applicazione fosse scritta meglio in Python. Python non scala (in linee di codice o prestazioni o gestione dei dati) come fa il C++ e non è adatto a molti degli usi a cui viene fatto il C++. La domanda suggerisce un programma C++ esistente che ha bisogno di un'interpretazione run-time per la personalizzazione. "più veloce da scrivere, più facile da leggere/ragionare" è solo una sciocchezza - con python è più facile trovare le librerie per iniziare i problemi di classe "ancora-un-altro" più velocemente, ma un ambiente C++ maturo con librerie personalizzate per il lavoro può essere meglio ancora. –

+0

@Tony, la leggibilità in genere è soggettiva (ecco perché ho detto che non esiste una regola concreta) e sono sicuro che non sia (python) corretto per ogni dominio del problema. Per le cose su cui ho lavorato, tuttavia, si è adattato bene in termini di LOC ed espressività. Un'ultima nota sul pregiudizio ... la maggior parte delle cose c/C++ che guardo sono molto difficili da leggere per me, ma probabilmente è perché sono un ragazzo pitone. Il tuo profilo dice che sei un tipo C++, quindi spiegherebbe la tua opinione. –

+0

Inoltre, questa domanda richiede una risposta parziale, poiché nessuno (senza vedere il suo programma esatto) può dire con certezza l'opzione * migliore * per lui. –

2

Mantenerlo semplice e ottimizzare le prestazioni in base alle esigenze. Il motivo principale per l'incorporamento di un interprete in un'app C++ è di consentire la configurazione/i dati di runtime per specificare un po 'di elaborazione, ad esempio è possibile modificare lo script senza ricompilare il programma C++. Questa è la guida per quando chiamare l'interprete.Una volta in alcuni chiamano interprete, le ragioni principali di chiamare di nuovo in C++ sono:

  • per accedere o aggiornare alcuni dati che non possono ragionevolmente essere esposto come parametro per la chiamata (o attraverso qualche altro processo di registrazione l'interprete supporta)
  • per ottenere prestazioni migliori durante una parte fondamentale del trattamento

per questi ultimi, provare lo script prima (ammesso che sia facile sviluppare lì), quindi se è lento identificare dove e come alcuni C++ il codice potrebbe aiutare. Se/dove le prestazioni dimostrano un problema - come linea guida generale quando si chiama da C++ all'interprete o viceversa: provare ad allineare il maggior numero possibile di lavoro, quindi effettuare la chiamata nell'altro sistema. Se rimani bloccato, torna allo stackoverflow con un problema specifico e un codice reale.

Problemi correlati