2012-03-30 8 views
25

Ho fatto questa stessa domanda sulla lista MongoDB-utente: http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24I collegamenti Python MongoDB hanno un ordine di grandezza più lento di java?

Speravo che qualcuno su questo forum potrebbe avere una certa comprensione ...

Ho eseguito un semplice esperimento a confronto le prestazioni di cursore di iterazione usando python contro java e ho trovato che l'implementazione di Python è circa 10 volte più lenta. Speravo che qualcuno potesse dirmi se questa differenza è prevista o se sto facendo qualcosa di chiaramente inefficiente dal lato del pitone.

Il benchmark è semplice: esegue una query, scorre il cursore e controlla lo stesso campo in ogni documento. Nella versione python, posso controllare circa 22k documenti al secondo. Nella versione java, posso controllare circa 220k di documenti al secondo.

Ho visto un paio di domande simili sulle prestazioni pitone e ho preso il consiglio e hanno fatto sì che sto utilizzando le estensioni C:

>>> import pymongo 
>>> pymongo.has_c() 
True 
>>> import bson 
>>> bson.has_c() 
True 

Infine, non credo che la discrepanza è a causa di differenze fondamentali tra python e java, almeno a livello del mio codice di test. Ad esempio, se memorizzo i documenti interrogati in una lista python, posso scorrere su quella lista molto rapidamente. In altre parole, non è un loop-loop Python inefficiente che rappresenta la differenza. Inoltre, ottengo prestazioni quasi identiche Java vs Python quando si inseriscono documenti.

Qui ci sono un paio di dettagli sulla query:

  • Sia il pitone e java implementazioni utilizzano la stessa query sulla stessa raccolta e girano sulla stessa macchina.
  • La raccolta contiene circa 20 milioni di documenti.
  • La query restituisce circa 2 milioni di documenti, ovvero sto recuperando circa il 10% della raccolta.
  • Ogni documento contiene tre campi semplici: una data e due stringhe.
  • La query è indicizzata e il tempo trascorso nella query effettiva è trascurabile per entrambe le implementazioni python e java. È l'iterazione del cursore che tiene conto del runtime.
+7

Il driver Java può leggere l'intero set di risultati in memoria e il driver python trasmette i risultati. Potresti provare a impostare batch_size in entrambi i driver. –

+4

Puoi pubblicare il codice completo per entrambe le versioni di codice Python e Java? Possiamo vedere se altri possono duplicare i risultati. –

+1

Giusto per notare, se si segue il collegamento al thread di Google Gruppi, il codice viene pubblicato (entrambe le lingue) e revisionato da 10gen persone e vengono eseguiti ulteriori test. TL; Il test DR 10gen ha mostrato un po 'più di 2 volte più lento con python che java e alcuni dei differenziali nel test potrebbero provenire dalla versione di python utilizzata –

risposta

2

Bene guardando il tuo post su Google Gruppi così, ecco il mio 2c:

  1. Python è più lento di Java. Dato che Python non è stato digitato, l'interprete non può eseguire tutte le "magie" Java JIT e quindi sarà sempre più lento in fase di runtime.

  2. sui gruppi di Google filo si precisa che:

"La grande sorpresa nei risultati è come la performance di Python di riferimento degrada quando inserisco più breve valori Semmai,. I si sarebbe aspettato il contrario. Comparativamente, i numeri Java sono essenzialmente lo stesso per le stringhe long vs. short ".

Questo può essere fuorviante a causa del comportamento asincrono di Mongo quando si tratta di scritture.Assicurati di impostare lo stesso problema di scrittura quando si attivano tali scritture nei benchmark Java e Python (e preferibilmente impostarlo su SAFE_MODE). In altre parole, se non si imposta specificamente alcun problema di scrittura, accertarsi che il valore predefinito del driver sia lo stesso in entrambe le varianti di Python e Java.

Problemi correlati