Recuperación de puntos de referencia de redis vs memory en python (usando timeit)

Tengo una lista de números. Esta lista se almacena de dos maneras: ya sea como un objeto de python en memoria, o como una lista de redis (redis configurada en el mismo servidor).

Estoy comparando el tiempo que lleva recuperar estas dos listas, usando timeit de timeit . Esto es lo que hago en la shell de python:

 import timeit import redis POOL = redis.ConnectionPool(host='127.0.0.1',port=6379,db=0) my_server = redis.Redis(connection_pool=POOL) print min(timeit.Timer('pylist1 = my_server.lrange("nums:5",0,-1)', setup='from __main__ import my_server').repeat(7,1000)) 

Esto me da un tiempo de 1.92341279984 .

A continuación, cronometro el objeto python en memoria así:

 pylist = my_server.lrange("nums:5",0,-1) print min(timeit.Timer('pylist2 = pylist',setup='from __main__ import pylist').repeat(7,1000)) 

Esto me da un tiempo de 4.29153442383e-05 . Es decir, parece ser ~ 45K veces más rápido que recuperar la misma lista de redis.

Mi pregunta es la siguiente: ¿es correcto mi enfoque de comparación? Es decir, ¿estoy simulando con precisión la recuperación de redis frente a la recuperación de la memoria? Este es un gran aumento en el rendimiento para el caso de uso que tengo en mente, pero antes de implementar esto, solo quiero estar seguro de que no hice pruebas de referencia.

En la comparación que has presentado aquí, básicamente estás midiendo cuánto tiempo tarda Python en vincular un nuevo nombre a un valor en el segundo caso. Así que no me sorprende que esto sea mucho más rápido que comunicarse con un proceso diferente (Redis). Supongo que lo que me sorprende es que consideraría obtener un valor de Redis si existe la opción simplemente para mantenerlo en la memoria.

Por lo tanto, debe ser más claro por qué está usando Redis para esto en primer lugar. Siempre será más lento que la memoria en proceso, no se necesita un punto de referencia para eso. Debe preguntar “¿por qué no solo estoy usando listas y diccionarios de Python”? Hay varias respuestas válidas: sus datos son demasiado grandes para que quepan en la memoria, necesita las características específicas de la memoria caché, como permitir que los valores desaparezcan después de un tiempo, o desea usarlos para IPC o persistencia. Una vez que sepa la respuesta aquí, eso le informará la evaluación comparativa que desea hacer. Y la pregunta será más como “¿Cómo obtengo los beneficios / características que he enumerado anteriormente para la menor penalización de rendimiento”. Redis puede no ser la única respuesta. Puede considerar el shelf para la persistencia, o tal vez incluso una base de datos relacional completa o Mongo o lo que sea.

En resumen, una vez que tenga una buena idea de por qué, la frecuencia con la que se resuelve.