2013-04-22 2 views
2

Я довольно новичок в программировании и не понимаю причины замедления моей программы.Python 3.3 Замедление во время большой петли

Я работаю с наборами данных около 350 000 - 500 000 строк и оценил бы какое-то направление.

Мне нужно проверить все записи в новом списке на старый, чтобы обновить старые записи, а также добавить совершенно новые записи в конец списка.

Если заявление о печати добавлено в цикл переназначения и новое исключение строки, первые несколько тысяч итераций бывают быстрыми, но после этого программа становится очень медленной. (почти 1000 полных циклов в первые 3 секунды, после примерно 20000-й итерации скорость уменьшилась до более чем 100 полных циклов за 5 секунд, а на 60 000-й итерации она медленнее 100 полных петель за 15 секунд.)

ОЗУ использование менее 70% и ЦП поддерживается постоянным между 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, кроме:, точно укажите, что вы хотите поймать, чтобы скрыть ошибки. Моя забота на первый взгляд заключалась в том, что ваша старая = старая + новая строка копирует и уничтожает большие и большие списки каждой итерации цикла. Вместо этого используйте old.extend (new). – gps

ответ

2

Хорошо, давайте работать с Python 3.3. Я полагаю, для каждого списка в oldListOfLists должен быть один в newListOfLists, и вы в основном обновить значения, так, например, 0th из oldListOfLists обновляется 0-й из newListOfLists, тем 1ft и так далее - тот же индекс, вы можете упростить свой код.

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 

Если список из oldListofLists не обновляется один с тем же индексом в newListOfLists, он на самом деле не будет работать хорошо, вы можете себе это представить.

Редактировать: вы можете захотеть поймать что-то вроде IndexError, если нет соответствующего старого списка для активного нового списка, но не других, общих ошибок.

Редактировать2: + = является псевдонимом для расширения.

oldListOfLists+=newListOfLists 

такая же, как

oldListOfLists.extend(newListOfLists) 

Edit3: сделать код по-прежнему замедляется?Ваши последние списки (в индексе) становятся все больше и больше? Каков общий объем памяти обоих списков списков?

0

Когда у меня есть код, который работать медленно, я делаю то же самое, как объяснено в лучшем ответе this link

Вы можете увидеть, какая часть кода делает программа работает медленно и пытается ее улучшить

+0

Я не уверен, что понимаю, почему я сделал бы это. Я уже определил часть кода, которая является проблемой, я просто не знаю, как ее исправить. Второй цикл работает медленнее, несмотря на то, что он только редактирует данные, а затем удаляет хэш. Есть ли у вас какие-либо соображения по поводу того, почему приведенный выше код будет работать дольше для выполнения с каждой итерацией? Определяет ли Python записи списка, считая, что это путь к правильной позиции? Например: если x = [0,1,2,3,4,5,6,7] Должен ли Python выставлять 8 раз больше, чтобы посмотреть на x [7] vs x [0]? – user2308425

Смежные вопросы