2012-01-12 2 views
0

스레드 또는 다중 처리없이 빨리 완료하려면 다음 코드가 필요합니다. 누군가가 중대하게 평가 될 어떤 트릭을 알고 있다면. 어쩌면 for i in enumerate() 또는 계산하기 전에 문자열을 목록을 변경, 나는 잘 모르겠다.
아래 예제에서는 무작위 시퀀스를 사용하여 변수를 다시 만들려고 시도했지만 루프 내부의 일부 조건이 렌더링되지 않았습니다 ...이 예제에서는 괜찮습니다. 코드는 약간 더 오래 걸립니다. 현재 내 i7에서 아래의 예 (대부분 조건을 무시할 것입니다)가 1 초 만에 완료되므로 가능한 한 많이 얻으려고합니다. ListVar의 단순 복사본을 만듭니다Python, 빨리 완료하려면 다음 코드가 필요합니다.

import random 
import time 
import collections 
import cProfile 


def random_string(length=7): 
    """Return a random string of given length""" 
    return "".join([chr(random.randint(65, 90)) for i in range(length)]) 

LIST_LEN = 18400 
original = [[random_string() for i in range(LIST_LEN)] for j in range(6)] 
LIST_LEN = 5 
SufxList = [random_string() for i in range(LIST_LEN)] 
LIST_LEN = 28 
TerminateHook = [random_string() for i in range(LIST_LEN)] 
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Exclude above from benchmark 


ListVar = original[:] 
for b in range(len(ListVar)): 
    for c in range(len(ListVar[b])): 

     #If its an int ... remove 
     try: 
      int(ListVar[b][c].replace(' ', '')) 
      ListVar[b][c] = '' 
     except: pass 

     #if any second sufxList delete 
     for d in range(len(SufxList)): 
      if ListVar[b][c].find(SufxList[d]) != -1: ListVar[b][c] = '' 

     for d in range(len(TerminateHook)): 
      if ListVar[b][c].find(TerminateHook[d]) != -1: ListVar[b][c] = '' 
    #remove all '' from list 
    while '' in ListVar[b]: ListVar[b].remove('') 

print(ListVar[b]) 
+0

(목록에서 즉 찾는 mstrings) : 함께 이러한 제안을 퍼팅

같은 것을 제공합니다. 나는 그것을 위해 swig를 사용한다. 또한 목록 대신 해시가 빠를 수도 있습니다. –

+0

해결하려는 문제를 설명해 주시겠습니까? 코드를 이해하고 더 좋은 방법을 생각해 내기보다는 "X를하는 효율적인 방법은 무엇입니까?"라는 질문에 쉽게 답할 수 있습니다. – thesamet

+0

필터링 프로세스를 통해 목록을 실행하고 싶습니다. – Rhys

답변

3
ListVar = original[:] 

, 그래서 두 번째 수준 목록에 대한 변경은 원본에 영향을 미칠 것입니다. 그게 니가 원하는거야? 새로 수정 된 목록을 처음부터 새로 만드는 것이 훨씬 낫습니다.

for b in range(len(ListVar)): 
    for c in range(len(ListVar[b])): 

퍽 : 가능하면 언제나 목록을 반복합니다.

 #If its an int ... remove 
     try: 
      int(ListVar[b][c].replace(' ', '')) 
      ListVar[b][c] = '' 
     except: pass 

숫자 중간에 공백을 무시 하시겠습니까? 그건 맞지 않아. 숫자가 음수 일 수 있다면 try..except을 사용하는 것이 좋지만 긍정적 인 경우에만 .isdigit()을 사용하십시오.

 #if any second sufxList delete 
     for d in range(len(SufxList)): 
      if ListVar[b][c].find(SufxList[d]) != -1: ListVar[b][c] = '' 

그 이름이 잘못 되었습니까? SufxList는 접미어를 찾고 있음을 의미합니다. 그렇다면 .endswith()을 사용하십시오 (루프를 피하기 위해 튜플을 전달할 수 있습니다). 접미어가 실제로 문자열의 어느 위치에 있는지 찾으려면 in 연산자를 사용하십시오.

 for d in range(len(TerminateHook)): 
      if ListVar[b][c].find(TerminateHook[d]) != -1: ListVar[b][c] = '' 

다시 연산자 in을 사용하십시오. 여기에 any()도 유용합니다.

#remove all '' from list 
    while '' in ListVar[b]: ListVar[b].remove('') 

while가 O 인 (N^2), 즉 그것은 느릴 것이다. 공백을 제거하는 대신 목록 이해를 사용하여 시작할 수 있지만 정리 목록을 작성하는 것이 좋습니다.

print(ListVar[b]) 

아마도 인쇄물에 들여 쓰기가 잘못되었을 수도 있습니다. 당신은 C에서 코드의 일부를 다시 시도 할 수

suffixes = tuple(SufxList) 
newListVar = [] 
for row in original: 
    newRow = [] 
    newListVar.append(newRow) 
    for value in row: 
     if (not value.isdigit() and 
      not value.endswith(suffixes) and 
      not any(th in value for th in TerminateHook)): 
      newRow.append(value) 

    print(newRow) 
+0

큰 피드백에 감사드립니다. – Rhys

관련 문제