elG
Tengo un problema de rendimiento en un proyecto y lo reduje a algunas de las líneas de registro. Parece que las cadenas f se calculan incluso cuando mi función de registro está por encima del nivel de la línea que está registrando.
Considere este ejemplo para demostrar el problema:
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('MyLogger')
class MyClass:
def __init__(self, name: str) -> None:
self._name = name
def __str__(self) -> str:
print('GENERATING STRING')
return self._name
c = MyClass('foo')
logger.debug(f'Created: {c}')
Cuando se ejecuta este ejemplo, aparece “GENERATING STRING” en la pantalla, lo que indica que el __str__
el método se está ejecutando a pesar de que mi nivel de registro está configurado en INFO
y la línea de registro es para DEBUG
.
Por lo que puedo decir hoy, la solución es usar lo siguiente frente a una cadena f.
logger.debug('Created: %s', c)
Hay tres cosas que pasan por mi cabeza en este momento.
- La mayoría de los ejemplos y documentos que leo parecen ser bastante antiguos.
- Este proyecto es solo para Python 3.7+ (no se preocupa por ser compatible con versiones anteriores).
- Tengo muchas líneas de código para actualizar.
Tengo curiosidad por saber qué hacen los demás en esta situación. Es el %s
el mejor (más moderno) enfoque? ¿Hay una forma más moderna de iniciar sesión como se demostró anteriormente?
Tengo mucho código para actualizar (arreglar) y espero alinearme con las mejores prácticas modernas.
olinox14
El documentación dice que la biblioteca de registro está optimizada para usar el %s
estilo de formato. No recuerdo dónde se menciona exactamente, pero lo leí hace unos meses.
Editar – ¡Encontró! https://docs.python.org/3/howto/logging-cookbook.html#formatting-styles
editar2 – (gracias a Robin Nemeth): https://docs.python.org/3/howto/logging.html#optimización
-
aqui esta el link docs.python.org/3/howto/logging.html#optimización
– redactado
25 de enero de 2019 a las 15:16
-
Lástima, creo que las cuerdas f son mucho más legibles.
– CGFoX
30 de marzo de 2022 a las 14:10
Antwane
OMI, usando %s
en sus cadenas NO es el enfoque más moderno. Definitivamente, la mayoría de los desarrolladores preferirán usar f-strings porque es más conveniente y fácil de leer (y escribir).
Pero, curiosamente, encuentra un caso específico en el que es posible que no desee usar una cuerda f. Si necesita evitar la llamada automática de __str__()
método debido a un problema de optimización, entonces probablemente sea una buena razón para usar %s
en lugar de cuerdas f. Pero, esto también podría indicar que se puede hacer algo en su programa para reducir la complejidad de __str__()
. La mayoría de las veces no debería llevar tanto tiempo ni recursos calcular una representación de cadena para un objeto…
-
De acuerdo, definitivamente preferiría la sintaxis f-string. En este caso, el
__str__
El método convierte una marca de tiempo de época en una fecha legible por humanos. Es un problema de rendimiento porque se llama millones de veces en el registro de depuración.– el G
25 de enero de 2019 a las 16:01
-
Mirando a docs.python.org/3/howto/logging.html#optimización: “El formateo de los argumentos del mensaje se pospone hasta que no se pueda evitar”. El uso de la sintaxis de cadena f puede tener un costo de extracción, ya que formateará el mensaje incluso si no está registrado. Ver docs.python.org/3/howto/logging.html#optimización para información adicional.
-Fabrica Jammes
9 de julio de 2021 a las 7:16
En mi opinión, use f-strings, son más eficientes y más legible.
– jpp
25 de enero de 2019 a las 15:12
¿Leíste esto? docs.python.org/3/howto/logging.html#optimización Deberías usar
%s
por la razón exacta que describiste anteriormente (si en realidad lo entendí correctamente)– redactado
25 de enero de 2019 a las 15:13
@jpp Incluso si la cadena f siempre se evalúa y el
%
cadena solo si es necesario dentro del método de registro? (Nota: OP no está evaluando el%
cadena inmediatamente pero pasando los parámetros al método de registro)– tobias_k
25 de enero de 2019 a las 15:14
IIRC, una de las principales ventajas de
%
es que el registrador hará todo lo posible para registrar algo, incluso si la interpolación de los argumentos en la cadena falla de alguna manera. f-strings no tiene esa propiedad, y toda la llamada de registro puede fallar. Totalmente[citation-needed]
aunque.– deceze
♦
25 de enero de 2019 a las 15:20
Aquí hay un enlace mejor sin el
__
requisito: stackoverflow.com/questions/13131400/…– Un campeón
25 de enero de 2019 a las 15:34