Le prestazioni differiscono tra la codifica Python o C++ di OpenCV?




performance (2)

Come accennato nelle precedenti risposte, Python è più lento rispetto a C ++ o C. Python è costruito per semplicità, portabilità e, inoltre, creatività in cui gli utenti devono preoccuparsi solo del loro algoritmo, non di problemi di programmazione.

Ma qui in OpenCV, c'è qualcosa di diverso. Python-OpenCV è solo un wrapper attorno al codice C / C ++ originale. Viene normalmente utilizzato per combinare le migliori caratteristiche di entrambi i linguaggi, Prestazioni di C / C ++ e Semplicità di Python .

Quindi quando chiamate una funzione in OpenCV da Python, ciò che effettivamente viene eseguito è all'origine C / C ++ sottostante. Quindi non ci sarà molta differenza nelle prestazioni. (Ricordo che ho letto da qualche parte che la penalizzazione delle prestazioni è <1%, non ricordo dove. Una stima approssimativa con alcune funzioni di base in OpenCV mostra una penalizzazione nel caso peggiore <4% . ie penalty = [maximum time taken in Python - minimum time taken in C++]/minimum time taken in C++ ).

Il problema sorge quando il tuo codice ha molti codici Python nativi. Ad esempio, se stai creando le tue funzioni che non sono disponibili in OpenCV, le cose peggiorano. Tali codici sono eseguiti in modo nativo in Python, il che riduce notevolmente le prestazioni.

Ma la nuova interfaccia OpenCV-Python ha pieno supporto per Numpy. Numpy è un pacchetto per il calcolo scientifico in Python. È anche un wrapper attorno al codice C nativo. È una libreria altamente ottimizzata che supporta un'ampia varietà di operazioni con le matrici, altamente adatta all'elaborazione delle immagini. Quindi, se riesci a combinare correttamente le funzioni OpenCV e Numpy, otterrai un codice ad altissima velocità.

La cosa da ricordare è, cerca sempre di evitare loop e iterazioni in Python. Invece, utilizzare le funzioni di manipolazione degli array disponibili in Numpy (e OpenCV). Semplicemente aggiungendo due array numpy usando C = A+B è molto più veloce rispetto all'utilizzo di doppi loop.

Ad esempio, puoi controllare questi articoli:

  1. Manipolazione di array veloce in Python
  2. Confronto delle prestazioni delle interfacce OpenCV-Python, cv e cv2

Il mio obiettivo è di iniziare a poco a poco, ma prima devo decidere quale API di OpenCV è più utile. Prevedo che l'implementazione di Python sia più breve ma il tempo di esecuzione sarà più denso e lento rispetto alle implementazioni native di C ++. C'è qualche informazione in grado di commentare le differenze di prestazioni e di codifica tra queste due prospettive?


Hai ragione, Python è quasi sempre molto più lento del C ++ in quanto richiede un interprete, che C ++ no. Tuttavia, ciò richiede che il C ++ sia fortemente tipizzato, il che lascia un margine di errore molto più piccolo. Alcune persone preferiscono essere rigorosamente codificate, mentre altre preferiscono l'indulgenza intrinseca di Python.

Se vuoi un discorso completo sugli stili di codifica Python rispetto agli stili di codifica C ++, questo non è il posto migliore, prova a cercare un articolo.

EDIT: Poiché Python è un linguaggio interpretato, mentre il C ++ è compilato fino al codice macchina, in generale , è possibile ottenere vantaggi prestazionali utilizzando C ++. Tuttavia, per quanto riguarda l'uso di OpenCV, le librerie OpenCV core sono già compilate in codice macchina, quindi il wrapper Python attorno alla libreria OpenCV sta eseguendo codice compilato. In altre parole, quando si tratta di eseguire algoritmi OpenCV computazionalmente costosi da Python, non si vedrà gran parte del successo di una performance dal momento che sono già stati compilati per l'architettura specifica con cui si sta lavorando.







opencv