2013-06-07 4 views
3

Я пишу код python для обработки огромных объемов данных (почти 6 миллионов штук!). В коде я использую огромный цикл for для обработки каждого набора. В этом цикле я использую одни и те же переменные каждый цикл и перезаписываю их. Когда я запускал программу, я заметил, что чем дольше я ее запускал, тем медленнее она получалась. Более того, после дальнейших экспериментов я обнаружил, что скорость, если вы запустили ее для значений 10 000 - 10 100, была такой же, как от 0 до 100. Таким образом, я пришел к выводу, что, поскольку я не создавал больше переменных и просто обрабатывал существующие, каждый раз, когда я перезаписывал переменная, она должна быть где-то сохранена python.Что происходит с перезаписываемыми переменными в python?

So: Я прав? Должен ли он быть python, сохраняя мою перезаписанную? Или я не прав? Что-то еще происходит?

+1

Вы добавляете эти переменные в список? – Eric

+1

нам понадобится код, который поможет вам с этим. – SingleNegationElimination

+0

Python не «запоминает» старые значения; но вполне возможно, что вы создаете структуры в памяти, о которых вы не знаете, в результате чего ваша система меняет местами. –

ответ

0

Python не копирует исходное значение переменной перед сохранением перезаписанных переменных.

Возможно, вы видите эффект различных кешей с замедлением программы. Или, если вы создаете объекты, вызывается сборщик мусора для удаления созданных вами объектов, на которые больше не ссылаются.

У вас есть пример кода, который показывает это поведение, которое вы видите?

Например:

import hashlib 
import random 
import time 
def test(): 
    t = [] 
    for i in xrange(20000):   
     if (i == 0) | (i==100)|(i==10000)|(i==10100): 
      t.append(time.time()) 
     for j in range(1,10): 
      a = hashlib.sha512(str(random.random())) 
      b = hashlib.sha512(str(random.random())) 
      c = hashlib.sha512(str(random.random())) 
      d = hashlib.sha512(str(random.random())) 
      e = hashlib.sha512(str(random.random())) 
      f = hashlib.sha512(str(random.random())) 
      g = hashlib.sha512(str(random.random())) 
    print t[1]-t[0], t[3]-t[2] 

Затем работает в 10 раз:

>>> for i in range(10): 
     test() 
0.0153768062592 0.0147190093994 
0.0148379802704 0.0147860050201 
0.0145788192749 0.0147390365601 
0.0147459506989 0.0146520137787 
0.0147008895874 0.0147621631622 
0.0145609378815 0.0146908760071 
0.0144789218903 0.014506816864 
0.0146539211273 0.0145659446716 
0.0145878791809 0.0146989822388 
0.0146920681 0.0147240161896 

дает почти идентичные раз в пределах стандартной ошибки (особенно, если исключить самый первый интервал, где он был немного медленнее, где его должен был сначала инициализировать a, b, c, d, e, f, g).

0

Python использует подсчет ссылок для отслеживания переменных. Когда все ссылки на переменную удаляются, эта переменная собирает мусор. Однако эта сборка мусора выполняется питоном по собственной прихоти, а не сразу.

Возможно, ваш код идет быстрее, чем собирает мусор python, или что у вас что-то не так с вашим кодом. Поскольку вы не указали ни один из ваших кодов, нет никакого реального способа узнать.

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