2013-04-22 2 views
2

저는 프로그래밍에 익숙하지 않으며 프로그램이 느려지는 이유를 이해하지 못합니다.Python 3.3 대 루프 중에 느려짐

약 350,000 - 500,000 행의 데이터 세트로 작업 중이며 어떤 방향으로 고맙게 생각합니다.

이전 항목을 업데이트하고 완전히 새로운 항목을 목록 끝에 추가하려면 새 목록의 모든 항목을 이전 항목과 대조해야합니다.

인쇄 명령문이 재 할당 루프에 추가되고 새로운 행 예외가 발생하면 처음 몇 천 번의 반복이 빠르지 만 프로그램이 매우 느리게됩니다. (처음 3 초 동안 거의 1000 개의 완전한 루프가 실행되고 약 20,000 회 반복 된 후 5 초 안에 100 개의 전체 루프보다 속도가 느려지고 60,000 회 반복으로 15 초 이내에 100 개의 완전한 루프보다 느려집니다.)

RAM은 70 % 미만 사용량과 CPU는 48와 50 % 사이에서 일정하게 유지하고있다한다

코드는 다음과 같습니다

:

목록 목록의 각
import gc 
gc.disable() #this was added to possibly improve speed 

def updateOldList(oldListOfLists, newListOfLists): 
    oldListIndexDict = dict() 
    IDNumber = <index of ID number> 
    for i in range(len(oldListOfLists)): 
     oldListIndexDict[oldList[i][IDNumber]] = i 
    for i in range(len(newListOfLists)): 
     try: 
      oldIndex = oldListIndexDict[newListOfLists[i][IDNumber]] 
      oldListOfLists[oldIndex][0] = newListOfLists[i][0] 
      oldListOfLists[oldIndex][3] = newListOfLists[i][3] 
      del(oldListIndexDict[newListOfLists[i][IDNumber]]) #this was added to limit the number of entries in the hash table to attempt to improve speed 
     except: 
      oldListOfLists= oldListOfLists + newListOfLists 
return oldListOfLists 

내부 목록을 주문한 상태를 유지해야 그래서 나는 세트를 사용할 수 있다고 생각하지 않습니다.

다음 두 질문은 매우 유사하여 묻기 전에 설명을 시도/검토했습니다. 나는 천천히 실행 코드가있는 경우

python function slowing down for no apparent reason

Python function slows down with presence of large list

+0

'gc.disable()'을 제거하면 어떻게 될까요? 똑같다? – zch

+0

그것이 내가 원래 가지고 있었던 방법입니다, 그것을 추가함으로써 작은 이득이있었습니다. – user2308425

+0

bare except : 절을 사용하지 마십시오. 숨어있는 버그를 잡으려는 항목을 정확히 나열하십시오. 언뜻 보면 내 오래된 걱정거리는 오래된 루프 + 새로운 라인이 루프 반복마다 크고 큰리스트를 복사하고 파괴한다는 것입니다. 대신 old.extend (new)를 사용하십시오. – gps

답변

2

자, 파이썬 3.3을 사용해 보겠습니다. 예를 들어, oldListOfLists의 0 번째는 newListOfLists의 0 번째의 1피트에 의해 업데이트됩니다 나는이 newListOfLists에서 하나 여야합니다 oldListOfLists의 각 목록 가정, 당신은 대부분의 값을 업데이트하므로 같은 인덱스에서 코드를 단순화 할 수 있습니다.

def updateOldList(oldListOfLists, newListOfLists): 

    for i in range(lenNewListOfLists): 
     try:    
      oldListOfLists[i][0] = newListOfLists[i][0] 
      oldListOfLists[i][3] = newListOfLists[i][3]    
     except IndexError: 
      oldListOfLists+=newListOfLists 

return oldListOfLists 

newListOfLists에서 같은 인덱스 하나에 의해 업데이트되지 않습니다 oldListofLists의 목록, 실제로 잘 작동하지 않을 경우, 당신이 그것을 상상할 수 있습니다.

편집 : 활성화 된 새 목록에는 해당하는 이전 목록이 없지만 일반 오류에는 해당하지 않는 IndexError와 같은 것을 잡을 수 있습니다.

편집 2 : + =는 확장의 별명입니다.

oldListOfLists+=newListOfLists 

oldListOfLists.extend(newListOfLists) 

과 동일 EDIT3 : 여전히 속도가 느려집니다 코드를합니까?마지막 목록 (색인)이 커지면 커질까요? 두 목록의 전체 메모리 크기는 얼마입니까?

0

, 나는 당신이 코드의 일부가하고있다 볼 수 있습니다 this link

의 가장 좋은 대답에 설명 된대로 같은 일을 프로그램을 느리게 실행하고 개선하려고 시도하십시오.

+0

왜 이렇게 할 지 잘 모르겠습니다. 문제의 코드 부분을 이미 확인했지만 해결 방법을 모르겠습니다. 두 번째 루프는 데이터를 편집하고 해시를 삭제하는 경우에도 점진적으로 느려집니다. 위의 코드가 반복 될 때마다 실행하는 데 점진적으로 시간이 오래 걸리는 이유에 대해 의견이 있으십니까? 파이썬은 목록 항목을 올바른 위치로 계산하여 식별합니까? 예 : x = [0,1,2,3,4,5,6,7] 파이썬은 x [7] 대 x [0]을보기 위해 8 시간 이상을 exicute해야합니까? – user2308425