2015-07-10 8 views
8

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 "

+0

bu soru zaten çok sonraları saf 'open()' yönteminden daha tanıtıldı SO – The6thSense

+4

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. –

cevap

18

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