2015-07-09 18 views
5

hızını artırma Ben dizeleri listesini içeren bir giriş dosyası var.bir piton komut

ikinci hatta başlayarak her dördüncü hat üzerinden yineleme ediyorum. bu satırların her birinde itibaren

ben ilk ve son 6 karakter yeni bir dize yapmak ve bu yeni dize tektir yalnızca bir çıkış dosyasında bu koyun.

bunu yapmak yazdığı kod çalışır, ancak ben çok büyük derin sıralama dosyaları ile çalışıyorum ve bir gün boyunca çalıştıktan ve çok ilerleme olmamıştır. Yani mümkünse bunu daha hızlı hale getirmek için herhangi bir öneri arıyorum. Teşekkürler.

def method(): 
    target = open(output_file, 'w') 

    with open(input_file, 'r') as f: 
     lineCharsList = [] 

     for line in f: 
      #Make string from first and last 6 characters of a line 
      lineChars = line[0:6]+line[145:151] 

      if not (lineChars in lineCharsList): 
       lineCharsList.append(lineChars) 

       target.write(lineChars + '\n') #If string is unique, write to output file 

      for skip in range(3): #Used to step through four lines at a time 
       try: 
        check = line #Check for additional lines in file 
        next(f) 
       except StopIteration: 
        break 
    target.close() 
+0

Im lineCharsList büyük alır sonra senaryo çok yavaş alacak olduğunu. Hiçbir öneri yok ama sorunun büyük olasılıkla olduğu yer. – Loocid

+0

Ben de böyle düşünüyorum. Bir bilgisayar küme üzerinde çalıştığım kadar RAM bir sorun olmamalı. Ama bunu yapmak için daha iyi bir yol olup olmadığından emin değilim. Bir kenara –

+1

, sen '' 'with''' açıklamada çıktı dosyası içerebilir -' açık (input_file, 'r'), hedef olarak f, açık (çıkış_dosyası, 'w') olarak: '' '. – wwii

cevap

6

listesi yerine bir set olarak lineCharsList tanımlayan deneyin:

lineCharsList = set() 
... 
lineCharsList.add(lineChars) 

Yani in operatörün performansını artırmak gerekir. Ayrıca, eğer bellek hiç sorun değilse, tüm çıktıları bir liste içinde biriktirmek ve hepsini birden çok write() işlem yapmak yerine, sonuna kadar yazmak isteyebilirsiniz.

2

Oscar önerildiği gibi set kullanmanın yanı sıra, aynı zamanda satırları atlamak için islice kullanabilirsiniz ziyade for döngüsü kullanın.

this post'da belirtildiği gibi, islice yineleyiciyi C içinde önceden işlemden geçirir, dolayısıyla döngü için düz bir vanilya python'u kullanmaktan çok daha hızlı olmalıdır.

1

deneyin bu şartlara bağlı olarak, daha verimli olabilir olarak

lineChars = ''.join([line[0:6], line[145:151]])

ile

lineChars = line[0:6]+line[145:151]

değiştirilmesi. Sorunu varsayarak