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.
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. –
Puoi pubblicare il codice completo per entrambe le versioni di codice Python e Java? Possiamo vedere se altri possono duplicare i risultati. –
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 –