python performance file-io

python - Lectura de archivo usando "open()" vs "with open()"



performance file-io (1)

Esta pregunta ya tiene una respuesta aquí:

Sé que hay muchos artículos y preguntas respondidas con respecto a la lectura de archivos en Python. Pero aún me pregunto qué hizo que Python tuviera múltiples formas de hacer la misma tarea. Simplemente lo que quiero saber es, ¿cuál es el impacto en el rendimiento del uso de estos dos métodos?


El uso with declaración no es para aumentar el rendimiento, no creo que haya ninguna ganancia o pérdida de rendimiento asociada con el uso with declaración, siempre que realice la misma actividad de limpieza que el uso with declaración se realizaría automáticamente.

Cuando usa with declaración con función open , no necesita cerrar el archivo al final, ya que with lo cerraría automáticamente.

Además, with declaración no es solo para abrir archivos, sino que se usa junto con los administradores de contexto. Básicamente, si tiene un objeto que desea asegurarse de que se limpia una vez que haya terminado con él o se produzca algún tipo de error, puede definirlo como un administrador de contexto y with declaración llamará a su __enter__() y __exit__() métodos de entrada y salida del bloque with. De acuerdo con PEP 0343 -

Este PEP agrega una nueva declaración " with " al lenguaje Python para que sea posible factorizar los usos estándar de las declaraciones try / finally.

En este PEP, los administradores de contexto proporcionan los __enter__() y __exit__() que se invocan al entrar y salir del cuerpo de la instrucción with.

Además, las pruebas de rendimiento de usar with y no usarlo:

In [14]: def foo(): ....: f = open(''a.txt'',''r'') ....: for l in f: ....: pass ....: f.close() ....: In [15]: def foo1(): ....: with open(''a.txt'',''r'') as f: ....: for l in f: ....: pass ....: In [17]: %timeit foo() The slowest run took 41.91 times longer than the fastest. This could mean that an intermediate result is being cached 10000 loops, best of 3: 186 µs per loop In [18]: %timeit foo1() The slowest run took 206.14 times longer than the fastest. This could mean that an intermediate result is being cached 10000 loops, best of 3: 179 µs per loop In [19]: %timeit foo() The slowest run took 202.51 times longer than the fastest. This could mean that an intermediate result is being cached 10000 loops, best of 3: 180 µs per loop In [20]: %timeit foo1() 10000 loops, best of 3: 193 µs per loop In [21]: %timeit foo1() 10000 loops, best of 3: 194 µs per loop