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.

È stato utile?

Soluzione

  1. 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.
  2. Credo che la stragrande maggioranza di NumPy e SciPy sia scritta in C e racchiusa in Python per facilità d'uso.
  3. 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.

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