2016-04-05 19 views
1

Birden çok dosyanın belirli satırlarını açmaya ve her dosyanın satırlarını döndürmeye çalışıyorum. Benim çözümüm oldukça zaman alıyor. hiç önerin var mı?
func.filename: Verilen dosyanın
func.start_line adı: Verilen dosyadaki başlangıç ​​noktası
func.endline:Birden çok dosya içinde belirli satırları açmak

def method_open(func): 
    try: 
     body = open(func.filename).readlines()[func.start_line: 
               func.end_line] 
    except IOError: 
     body = [] 
     stderr.write("\nCouldn't open the referenced method inside {0}". 
        format(func.filename)) 
     stderr.flush() 
    return body 

akılda mı verilen dosyada noktayı bitirme bazen açılış dosyası func.filename olabilir Aynı maalesef, çoğu zaman bu durum böyle değil.

+0

Neden bu kadar zaman alıyor? Dosya çok mu büyük? Öyleyse ne kadar büyük? –

+0

[linecache] (https://docs.python.org/2/library/linecache.html) modülünü veya "itertools.islice" dosyasını deneyebilir ve ayrıca çok zaman alıcı olup olmadıklarını görebilirsiniz. Burada daha fazla bilgi görmek için: http://stackoverflow.com/questions/2081836/reading-specific-lines-only-python –

+0

hayır, sanırım sorun şu ki tekrar açıp kapatacağım ve tekrar kapatıyorum, abec linecache can Aynı anda çok çizgili çizgilere sahip olsaydı ilginç olurdu. –

cevap

2

Okuma satırlarındaki sorun, tüm dosyayı belleğe okuyup linecache'nin aynı şeyi yapmasıdır.

Bir seferde bir satır okuyarak ve en kısa sürede func.endline

ulaşırken devreyi keserek biraz zaman kazandırabilir Ama buldum iyi yöntem İşte sonuçlarını itertools.islice

kullanmaktır

İşte
--- 1.43700003624 seconds --- f_readlines 
--- 1.00099992752 seconds --- f_enumerate 
--- 1.1400001049 seconds --- f_linecache 
--- 0.0 seconds --- f_itertools_islice 

ben

import time 
import linecache 
import itertools 


def f_readlines(filename, start_line, endline): 
    with open(filename) as f: 
     f.readlines()[5000:10000] 


def f_enumerate(filename, start_line, endline): 
    result = [] 
    with open(filename) as f: 
     for i, line in enumerate(f): 
      if i in range(start_line, endline): 
       result.append(line) 
      if i > endline: 
       break 


def f_linecache(filename, start_line, endline): 
    result = [] 
    for n in range(start_line, endline): 
     result.append(linecache.getline(filename, n)) 


def f_itertools_islice(filename, start_line, endline): 
    result = [] 
    with open(filename) as f: 
     resultt = itertools.islice(f, start_line, endline) 
     for i in resultt: 
      result.append(i) 


def runtest(func_to_test): 
    filename = "testlongfile.txt" 
    start_line = 5000 
    endline = 10000 
    start_time = time.time() 
    func_to_test(filename, start_line, endline) 
    print("--- %s seconds --- %s" % ((time.time() - start_time),func_to_test.__name__)) 

runtest(f_readlines) 
runtest(f_enumerate) 
runtest(f_linecache) 
runtest(f_itertools_islice) 
kullanılan komut bulabilirsiniz: Ben ~ 9701k hatlarının bir 130MB dosya üzerinde yapmış bazı testler
+0

ilginç! Bu soruya şu sorudan en hızlı hangisi olduğu sorusunu yanıtlıyor: http://stackoverflow.com/questions/2081836/reading-specific-lines-only-python Teşekkür ederiz! –