python - Lectura de archivo usando "open()" vs "with open()"
performance file-io (1)
Esta pregunta ya tiene una respuesta aquí:
- ¿Para qué está diseñada la declaración "con" python? 10 respuestas
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