2009-11-05 4 views
4

im используя фантастический код для кодирования python, у него есть инструмент, созданный в так называемом «циклопе», который, по-видимому, ищет циклы. После запуска он дает мне кучу больших смелых красных букв, объявляющих, что в моем коде есть множество циклов. Проблема в том, что выход почти не поддается анализу, и понять, что такое цикл, читая его выход, невозможно. ive просматривал веб часами и не мог найти столько, сколько в блоге. когда циклы накапливаются до определенной точки, профайлер и отладчик перестают работать :(.Что такое циклы? по отношению к python

мой вопрос - что такое циклы, как я знаю, когда я делаю цикл, как я могу избежать циклов в python.

ответ

4

Цикл (или «петля ссылки») состоит из двух или более объектов, относящиеся друг к другу, например:

alist = [] 
anoth = [alist] 
alist.append(anoth) 

или

class Child(object): pass 

class Parent(object): pass 

c = Child() 
p = Parent() 
c.parent = p 
p.child = c 

Конечно, это чрезвычайно простые примеры с циклами всего двух предметов; примеры реальной жизни часто бывают более продолжительными и сложными. Там нет волшебной пули, говорящей вам, что вы только что сделали цикл - вам просто нужно следить за этим. Модуль gc (чья конкретная задача состоит в сборе непрозрачных циклов сбора мусора) может помочь вам диагностировать существующие циклы (когда вы устанавливаете соответствующие флаги отладки). Модуль weakref может помочь вам избежать создания циклов, когда вам нужно (например), чтобы ребенок и родитель знали друг о друге, не создавая ссылочный цикл (сделайте только одну из двух взаимных ссылок в слабый ref или прокси-сервер или используйте удобные контейнеры со слабым словарем, которые поставляются модулем).

+0

Спасибо, Алекс, я понял это сейчас, еще один, является слабым только для того, чтобы иметь ребенка и родителя, чтобы узнать о существовании каждого из них? – spearfire

+0

@spearfire, нет, есть много способов - вы можете решить создать цикл в конце концов; или, вы можете поместить все сущности в dict, каждый с уникальным ключом, и иметь другие объекты, удерживающие такие ключи в этом dict (для использования только после проверки того, что ключ все еще там!) вместо ссылки на объекты напрямую - - и многое другое. –

1

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

Нижняя линия: если вы не наблюдаете утечку памяти, вам не нужно беспокоиться о выходе Cyclops в большинстве случаев.

+0

Спасибо за то, что Силас, циклопы - это мусор, если я, m, не ссылаюсь на вещи, которые ссылаются на вещи, на которые они ссылаются. <- теперь это глоток. – spearfire

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