2014-09-25 3 views
0

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

>>index = 0 
>>for i in all: 
     index += 1 
     begin_time = time.time() 
     for j in all[index:]: 
      ... 
      here are some data processing,then make comparison, 
      ... 
      print time.time()-begin_time 

тогда становится медленнее со временем, он будет принимать 0.1s каждый петлю в начале, и через полчаса, это займет около 1 с каждой петли. кто-то сказал, что это связано с сборкой мусора, но когда я добавляю gc.disable() перед операцией, он все равно не улучшается. Кто может мне сказать, что мне делать?

+0

'gc.disable()' просто сделать его хуже! Вы пробовали 'gc.enable()';). – Veedrac

+0

только маленький наконечник; вы можете использовать 'for index, i в перечислении (все):' для получения индекса и элемента – corvid

+1

Нам нужно посмотреть часть обработки данных. – Veedrac

ответ

1

Ваш алгоритм O(n^2), что довольно плохо. Если возможно, подумайте об изменении алгоритма.

Кроме того, рассмотрите возможность использования itertools вместо ручной комбинированной обработки. Это будет значительно более удобным для чтения, и это, вероятно, будет более ЭФФЕКТИВНАЯ, чем ваш подход:

import itertools 
for i,j in itertools.product(all, all): 
    print i,j 
+0

, мой алгоритм очень медленный, но Я действительно не могу найти лучший способ. Поскольку мне нужно найти все подобные данные в наборах данных, и эти данные не могут быть отсортированы для уменьшения времени сравнения. Но почему это становится медленнее со временем? Он должен стать быстрее. С точки зрения кода, для этого первые данные нужно сравнить N раз, а во вторых данных нужно сравнить N-1 раз – tengtengge

+0

. Хотя вы видите, как вы выполняете анализ данных, возможно, более эффективная специализированная библиотека, такая как панды. Я согласен с вами в том, что ваш подход не должен замедляться. Но попробуйте itertools.product и сообщите нам об этом. – Denis

+0

Хорошо, я попробую. это комментарий, который: «для меня проблема в том, что память - это память. Срезание создает новые экземпляры .. так что есть память примерно за 20 тыс. * 20 к-20 тыс.« пунктов ». - Паоло Каскилло 1 час назад», я думаю, что срез будет временным и не будет долго жить в памяти, не так ли? Значит, это не причина? – tengtengge

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