Red de conocimiento informático - Problemas con los teléfonos móviles - ¡Herramientas de mejora del rendimiento de Python!

¡Herramientas de mejora del rendimiento de Python!

El término caché del que hablamos a menudo es más similar a almacenar datos en el disco duro en la memoria para aumentar la velocidad de lectura. Por ejemplo, el redis a menudo mencionado se usa a menudo para el almacenamiento en caché de datos. El caché de Python (lru_cache) es una decoración para la función en ejecución. Los resultados de la ejecución se almacenarán en caché cuando se realice la siguiente solicitud, si los parámetros pasados ​​por la función de solicitud no han cambiado, el caché de resultados se devolverá directamente en lugar de ejecutar. función decorador de caché.

Entonces, ¿cuál es la diferencia entre esto y redis? ¿Cuáles son las ventajas? ¿Cómo utilizar?

1. Ahora escribimos una función para sumar dos números sin usar caché y la llamamos dos veces:

Resultado de la ejecución

Puedes ver que la prueba es ejecutado dos veces, ahora agregamos caché para ejecutarlo:

Resultados de la ejecución

Puede ver que la función de prueba se ejecuta solo una vez, la segunda vez. Esta llamada usa el valor almacenado en caché para generar el resultado directamente.

2. Cuando resolvemos la secuencia de Fibonacci de forma recursiva (la secuencia de Fibonacci se refiere a: 0, 1, 1, 2, 3, 5, 8, a partir del tercer término, cada término es igual a la Suma de los dos primeros términos):

Encuentra el término 40 de la secuencia de Fibonacci sin almacenamiento en caché

Tiempo de ejecución

Usa el caché para encontrar el elemento 40 de Fibonacci de la secuencia de escrituras :

Tiempo de ejecución

La diferencia entre los dos es muy obvia, porque si no usas el caché, equivale a ejecutar repetidamente una gran cantidad de funciones, y si use lru_cache, los resultados de la función ejecutada anteriormente se han almacenado en caché y no es necesario ejecutarlos nuevamente.

Al observar el código fuente de lru_cache, encontrará que puede pasar dos parámetros: maxsize, escrito:

Indica el número máximo de resultados que se pueden almacenar en caché mediante el método decorado por lru_cache (si el método decorado Los resultados serán diferentes si se pasan diferentes parámetros al método; los resultados serán los mismos si se pasan los mismos parámetros), y los resultados serán los mismos si no se especifican parámetros. strong>, si no se especifican parámetros de paso, el valor predeterminado es 128, lo que significa que el número máximo de resultados para almacenar en caché es 128, y cuando se alcanza 128, si hay nuevos resultados para guardar, se eliminarán los resultados más antiguos. Si maxsize se pasa como Ninguno, entonces puede almacenar en caché resultados ilimitados.

El valor predeterminado es falso, lo que significa que no diferenciará entre tipos de datos; si está configurado en Verdadero, entonces diferenciará entre todos; La transferencia del tipo de parámetros para el almacenamiento en caché se describe oficialmente de la siguiente manera:

Sin embargo, cuando se probó en Python 3.9.8, lo escrito era falso.

Al realizar pruebas en Python 3.9.8, lo escrito es falso. Según el método de prueba oficial, los resultados de la prueba aún se tratarán de manera diferente y el caché también será diferente si lo escrito es falso o verdadero. Diferente a la descripción oficial:

Resultados

Los resultados se almacenarán en caché de manera diferente si se escriben como verdadero o falso. Pero en caso de múltiples parámetros, se tratará como un solo resultado:

Resultado de la ejecución

Cuando la escritura se establece en verdadero:

Resultado de la ejecución

>

Diferenciar el almacenamiento en caché cuando el número de parámetros pasados ​​es mayor que el número de parámetros pasados.

Cuando el número de parámetros pasados ​​es mayor que 1, se ajusta a la declaración oficial. No está claro si el ejemplo oficial es incorrecto.

Cuando los parámetros pasados ​​son parámetros variables. (como dict, list, etc.), lru_cache no admite este parámetro, por lo que se informará un error:

Resultado del error

Si la ubicación del caché admite parámetros variables, si admite la distribución , ya sea que admita el tiempo de vencimiento, la estructura de datos admitida debe instalarse por separado y redis se almacena en caché en redis -Caché en la memoria administrada por redis sí sí sí sí Admite 5 estructuras de datos sí lru_cache se almacena en caché en la memoria del proceso de la aplicación y es se borra cuando se cierra la aplicación no no no no Diccionario (parámetro: clave, resultado: valor) no

Después del análisis anterior, la función lru_cache es mucho más simple que redis, pero es más fácil de usar y adecuada para pequeñas aplicaciones individuales. Si tiene más datos para almacenar en caché y desea una mejor administración de la caché, o necesita almacenar en caché datos que tienen un tiempo de vencimiento (como tokens para la autenticación de inicio de sesión), entonces usar redis será mejor que lru_cache.