Quanto di NumPy e SciPy è in C?
-
22-07-2019 - |
Domanda
Parti di NumPy e / o SciPy sono programmate in C / C ++?
E come si confronta l'overhead della chiamata C da Python con l'overhead della chiamata C da Java e / o C #?
Mi chiedo solo se Python sia un'opzione migliore di Java o C # per le app scientifiche.
Se guardo le sparatorie , Python perde di un enorme margine. Ma suppongo che ciò sia dovuto al fatto che non utilizzano librerie di terze parti in tali benchmark.
Soluzione
-
Metterei in dubbio qualsiasi benchmark che non mostri la fonte per ogni implementazione (o ho perso qualcosa)? È del tutto possibile che una o entrambe queste soluzioni siano codificate male, il che comporterebbe una valutazione ingiusta delle prestazioni di una o entrambe le lingue.[Modifica] Oops, ora vedo la fonte. Come altri hanno sottolineato, tuttavia, non sta usando le librerie NumPy / SciPy, quindi quei benchmark non ti aiuteranno a prendere una decisione. - Credo che la stragrande maggioranza di NumPy e SciPy sia scritta in C e racchiusa in Python per facilità d'uso.
- Probabilmente dipende da cosa stai facendo in una di quelle lingue su quanto sovraccarico ci sia per una particolare applicazione.
Ho usato Python per l'elaborazione e l'analisi dei dati da un paio d'anni, quindi direi che è sicuramente adatto allo scopo.
Cosa stai cercando di ottenere alla fine della giornata? Se vuoi un modo veloce per sviluppare codice leggibile, Python è un'opzione eccellente e sicuramente abbastanza veloce per una prima pugnalata a qualunque cosa tu stia cercando di risolvere.
Perché non avere una bash su ciascuno per un piccolo sottoinsieme del tuo problema e confrontare i risultati in termini di tempo di sviluppo e tempo di esecuzione? Quindi puoi prendere una decisione obiettiva sulla base di alcuni dati rilevanti ... o almeno è quello che farei :-)
Altri suggerimenti
Molto è scritto in C o fortran. Puoi riscrivere gli hot loop in C (o utilizzare uno dei modi gazillion per accelerare il pitone, boost / weave è il mio preferito), ma importa davvero?
La tua app scientifica verrà eseguita una volta. Il resto è solo il debug e lo sviluppo, e quelli possono essere molto più veloci su Python.
La maggior parte di NumPy è in C, ma gran parte del codice C è "boilerplate". per gestire tutti i dettagli sporchi dell'interfaccia Python / C. Penso che il rapporto C vs. Python sia di circa 50/50 ATM per NumPy.
Non ho familiarità con i dettagli di basso livello basati su VM, ma credo che il costo dell'interfaccia sarebbe più alto a causa delle restrizioni poste su jvm e .clr. Uno dei motivi per cui il numpy è spesso più veloce di ambienti simili è la rappresentazione della memoria e il modo in cui le matrici vengono condivise / passate tra le funzioni. Mentre la maggior parte degli ambienti (anche Matlab e R credo) usano Copy-On-Write per passare le matrici tra le funzioni, NumPy usa i riferimenti. Ma farlo ad es. la JVM sarebbe difficile (a causa delle restrizioni su come usare il puntatore, ecc ...). È fattibile (esiste una prima porta di NumPy per Jython), ma non so come risolvano questo problema. Forse C ++ / Cli renderebbe tutto più semplice, ma non ho esperienza con quell'ambiente.
Esiste un confronto migliore qui (non un benchmark ma mostra i modi per velocizzare Python). NumPy è scritto principalmente in C. Il principale vantaggio di Python è che ci sono molti modi per molto estendere facilmente il tuo codice con C (ctypes, swig, f2py) / C ++ (boost.python, weave .inline, weave.blitz) / Fortran (f2py) - o anche semplicemente aggiungendo annotazioni di tipo a Python in modo che possa essere elaborato in C (cython). Non penso che ci siano molte cose relativamente facili per C # o Java - almeno che in modo così apparentemente gestiscono il passaggio di matrici numeriche di diversi tipi (anche se immagino che i sostenitori sostengano che non hanno la penalità prestazionale di Python, c'è meno bisogno a).
Dipende sempre dalla tua capacità di gestire la lingua, quindi la lingua è in grado di generare codice veloce. Dalla mia esperienza, numpy è molte volte più lento delle buone implementazioni .NET. E mi aspetto che JAVA sia simile velocemente. I loro compilatori JIT ottimizzati sono notevolmente migliorati nel corso degli anni e producono istruzioni molto efficienti.
numpy d'altra parte viene fornito con una sintassi che è più facile da usare per quelli che sono in sintonia con i linguaggi di scripting. Ma se si tratta di sviluppo di applicazioni, questi vantaggi spesso si trasformano in ostacoli e desidererai ardentemente la sicurezza dei caratteri e gli IDE aziendali. Inoltre, il gap sintattico si sta già chiudendo con C #. Esiste un numero crescente di biblioteche scientifiche per Java e . NET . Personalmente tendo verso C #, perché fornisce una migliore sintassi per array multidimensionali e in qualche modo sembra più moderno'. Ma ovviamente, questa è solo la mia esperienza personale.