not collection mongodb pymongo mongodb-java

collection - mongodb not null



MongoDB python enlaza un orden de magnitud más lento que java? (1)

Mirando bien su publicación en Grupos de Google también, aquí está mi 2c:

  1. Python es más lento que 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 el hilo de Grupos de Google se afirma que:

"La gran sorpresa en los resultados es cómo el rendimiento del benchmark de Python se degrada cuando inserto valores más cortos . En todo caso, hubiera esperado lo contrario. Comparativamente, los números de Java son esencialmente los mismos para cadenas largas y 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.

Hice esta misma pregunta en la lista de usuarios de mongodb: http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24

Esperaba que alguien en este foro pudiera tener alguna idea ...

He realizado un experimento simple que compara el rendimiento de la iteración del cursor usando Python contra Java y he descubierto 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.

El punto de 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 algunas preguntas similares sobre el rendimiento de Python y tomé el consejo y me aseguré de usar las extensiones C:

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

Finalmente, no creo que la discrepancia se deba a 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.

Aquí hay algunos detalles más sobre la consulta:

  • Tanto la implementación de Python como la de Java usan la misma consulta en la misma colección y se ejecutan en la misma máquina.
  • La colección contiene alrededor de 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.