2012-03-30 6 views
25

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.
+7

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. –

+4

¿Se puede publicar el código completo en las versiones de código Python y Java? Podemos ver si otros pueden duplicar sus resultados. –

+1

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 –

Respuesta

2

Bueno buscando en su puesto en Google Groups, así, aquí está mi 2c:

  1. Python es más lento que el de Java. Como Python no está tipeado, su intérprete no puede hacer toda la "magia" Java JIT, por lo que siempre será más lento en el tiempo de ejecución.

  2. En los grupos de Google HILO se afirma que:

"La gran sorpresa en los resultados es como el rendimiento del pitón de referencia degrada cuando inserto más corto valores En todo caso,. I habría esperado lo contrario. Comparativamente, los números de Java son esencialmente iguales para cadenas largas versus cortas ".

Esto puede ser engañoso debido al comportamiento asincrónico de Mongo cuando se trata de escrituras.Asegúrese de establecer la misma Preocupación de escritura cuando active esas escrituras en sus puntos de referencia de Java y Python (y preferiblemente configúrelo en SAFE_MODE). En otras palabras, si no establece específicamente ninguna preocupación de escritura, asegúrese de que el valor predeterminado del controlador sea el mismo en las variantes de Python y Java.

Cuestiones relacionadas