2017-09-07 15 views
0

디렉토리의 파일 묶음에서 정규 표현식을 사용하여 문자열을 처리하고 있습니다. 파일의 각 줄마다 일련의 try-statements를 적용하여 패턴과 일치 시키면 입력을 변환합니다. 각 줄을 분석 한 후 새 파일에 기록합니다. 나는 이 try-else 다음에 if-statements (나는 그림으로 여기에 두 개만 포함했다)를 사용했다. 내 문제는 여기에 몇 가지 파일을 처리 한 후 스크립트가 너무 느려서 프로세스가 거의 완전히 정지된다는 것입니다. 내 코드에서 느려지는 원인을 알 수는 없지만 try-else + if-statement의 조합이라고 느낍니다. 데이터가 합리적인 속도로 처리되도록 변환을 어떻게 능률화 할 수 있습니까?파이썬에서 더 빠른 처리를 위해 일련의 try-except + if-statements를 간소화합니다.

아니면 같은 정도로 메모리에 세금을 부과하지 않는 효율적인 반복기가 필요합니까?

모든 의견을 보내 주시면 감사하겠습니다.

import re 
import glob 

fileCounter = 0 

for infile in glob.iglob(r'\input-files\*.txt'): 

    fileCounter += 1 
    outfile = r'\output-files\output_%s.txt' % fileCounter 

    with open(infile, "rb") as inList, open(outfile, "wb") as outlist: 

     for inline in inlist: 

      inword = inline.strip('\r\n') 

      #apply some text transformations 
      #Transformation #1 
      try: result = re.match('^[AEIOUYaeiouy]([bcćdfghjklłmnńprsśtwzżź]|rz|sz|cz|dz|dż|dź|ch)[aąeęioóuy](.*\[=\].*)*', inword).group() 
      except: result = None 

      if result == inword: 
       inword = re.sub('(?<=^[AEIOUYaeiouy])(?=([bcćdfghjklłmnńprsśtwzżź]|rz|sz|cz|dz|dż|dź|ch)[aąeęioóuy])', '[=]', wbWord) 

      #Transformation #2 etc. 
      try: result = re.match('(.*\[=\].*)*(\w?\w?)[AEIOUYaąeęioóuy]\[=\][ćsśz][ptkbdg][aąeęioóuyrfw](.*\[=\].*)*', inword).group() 
      except: result = None 

      if result == inword: 
       inword = re.sub('(?<=[AEIOUYaąeęioóuy])\[=\](?=[ćsśz][ptkbdg][aąeęioóuyrfw])', '', inword) 
       inword = re.sub('(?<=[AEIOUYaąeęioóuy][ćsśz])(?=[ptkbdg][aąeęioóuyrfw])', '[=]', inword) 

      outline = inword + "\n" 
      outlist.write(outline) 

    print "Processed file number %s" % fileCounter   
print "*** Processing completed ***" 
+1

https://codereview.stackexchange.com/ –

답변

1

시도는/제외하고는 참으로 re.match()의 결과를 테스트하는 가장 효율적인 방법 (도 가장 읽을 것)이 아니라, 페널티 히트는 여전히 (더 이하) 일정해야 - 성능해야 실행 중에 성능이 저하되지 않습니다 (데이터로 인해 최악의 상황이 발생할 때까지). 문제는 다른 곳에서도 발생합니다. 당신이 즉, 대신, 적절한 표준 솔루션으로 블록을 제외하고/당신의 시도를 대체하여 시작할 수 있습니다

FWIW :

try: 
    result = re.match(someexp, yourline).group() 
except: 
    result = None 

은 당신이 원하는 :

match = re.match(someexp, yourline) 
result = match.group() if match else None 

이 약간, perfs을 향상 하겠지만 대부분의 중요한 것은 코드를 더 읽기 쉽고 훨씬 유지 보수 할 수 있도록 만드는 것입니다. 최소한 예기치 않은 오류를 숨기지 않습니다. 보조 노트로

, 항상에만 예상 예외를 포착, 절을 제외하고 베어를 사용하지 않습니다 (여기가되었을 것 인 AttributeError 어떤 속성 group을 아무것도 일치하지 않고 None 물론이 None 반환 re.match()부터).

이것은 아마도 당신의 문제를 해결하지는 못하지만 적어도 다른 곳에서는 그 문제가 무엇인지 알게 될 것입니다.

+0

감사합니다. Bruno. 매우 도움이됩니다! –