hice esta misma pregunta en la lista mongodb usuario: http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24MongoDB python vincula un orden de magnitud más lento que java?
que estaba esperando a alguien en este foro podría tener una idea ...
me he encontrado un sencillo experimento que compara el comportamiento de la iteración del cursor usando python vs. java y descubrimos que la implementación de python es aproximadamente 10 veces más lenta. Esperaba que alguien me dijera si se espera esta diferencia o si estoy haciendo algo claramente ineficiente en el lado de Python.
La referencia es simple: realiza una consulta, itera sobre el cursor e inspecciona el mismo campo en cada documento. En la versión de Python, puedo inspeccionar unos 22k documentos por segundo. En la versión java, puedo inspeccionar unos 220k documentos por segundo.
he visto un par de preguntas similares sobre el rendimiento de pitón y he tomado el consejo y se aseguró de que estoy usando las extensiones C:
>>> import pymongo
>>> pymongo.has_c()
True
>>> import bson
>>> bson.has_c()
True
Por último, las que no creo es la discrepancia debido a las diferencias fundamentales entre Python y Java, al menos en el nivel de mi código de prueba. Por ejemplo, si almaceno los documentos consultados en una lista de Python, puedo iterar sobre esa lista muy rápidamente. En otras palabras, no es un ciclo de salto de Python ineficiente el que da cuenta de la diferencia. Además, obtengo un rendimiento casi idéntico Java vs. Python al insertar documentos.
Éstos son algunos detalles más sobre la consulta:
- Tanto el pitón y java implementaciones utilizan la misma consulta en la misma colección y se ejecutan en la misma máquina.
- La colección contiene aproximadamente 20 millones de documentos.
- La consulta devuelve aproximadamente 2 millones de documentos, es decir, estoy recuperando aproximadamente el 10% de la colección.
- Cada documento contiene tres campos simples: una fecha y dos cadenas.
- La consulta está indexada y el tiempo invertido en la consulta real es insignificante para las implementaciones de python y java. Es la iteración del cursor que da cuenta del tiempo de ejecución.
El controlador de Java puede leer todo el conjunto de resultados en la memoria y el controlador de Python transmite los resultados. Podría intentar configurar el tamaño_batch en ambos controladores. –
¿Se puede publicar el código completo en las versiones de código Python y Java? Podemos ver si otros pueden duplicar sus resultados. –
Solo tenga en cuenta que si sigue el enlace al subproceso de Grupos de Google, el código se publicará (en ambos idiomas) y 10gen personas lo revisarán y se realizarán más pruebas. TL; DR 10gen pruebas mostraron un poco más de 2 veces más lento con python que java y parte del diferencial en las pruebas puede provenir de la versión de python utilizada –