Python'da okuma dosyaları ile ilgili birçok makale ve soru cevaplandığını biliyorum. Ama yine de, python'un aynı görevi yerine getirmenin birden fazla yolunun ne olduğunu merak ediyorum. Basitçe bilmek istediğim, bu iki yöntemi kullanmanın performans etkisi nedir?"open()" vs ile okuma "open()" ile okunan "
cevap
performans kazancı için with
deyimi değildir kullanarak, sürece, sen with
ifadesini kullanarak otomatik yapmak istiyorsunuz aynı temizleme faaliyeti gerçekleştirirken, with
ifadesini kullanarak ilişkili herhangi bir performans kazancı veya kaybı vardır sanmıyorum.
open
işleviyle with
deyimini kullandığınızda, dosyanın sonuna kapatmanız gerekmez; çünkü with
otomatikman sizin için kapatır.
Ayrıca, with
bildirimi, yalnızca açılış dosyaları için değil, içerik yöneticileriyle birlikte kullanılır. Temel olarak, bir kez bittiğinde veya bir çeşit hata oluştuğunda, temizlendiğinden emin olmak istediğiniz bir nesneye sahipseniz, bir context manager ve with
bildirimi olarak tanımlayabilirsiniz; __enter__()
ve __exit__()
yöntemlerine girişte ve ile bloktan çıkın. PEP 0343 göre -
Bu PEP mümkün try/finally tabloların standart kullanımlarını faktörü dışında yapmak Python diline yeni bir bildiriyi "
with
" ekler.Bu PEP'de, içerik yöneticileri, giriş ifadesinin gövdesine giriş ve çıkışta çağrılan
__enter__()
ve__exit__()
yöntemlerini sağlar.
Ayrıca kullanmaktan with
kullanarak değil performans testi -
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
bu soru zaten çok sonraları saf 'open()' yönteminden daha tanıtıldı SO – The6thSense
Bağlam yöneticileri istendi. "Timeit.timeit()" yöntemiyle performansı ölçebilirsiniz. 'with' içerik yöneticisi sadece herhangi bir hataya kaynak ayırıyor, bu yüzden 'nihayet' cümleciğini yazmak zorunda değilsiniz. –