Уменьшить трассировку стека исполняемого кадра - PullRequest
0 голосов
/ 15 сентября 2018

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

Я заново изучаю некоторые основы архитектуры ЦП и подумал, что было бы забавно реализовать эмуляцию ЦП с «реальной» логикой JMP или как можно ближе к ней в программном обеспечении.

Однако я застреваю в процессе рендеринга указанной логики. Код (согласно моему лучшему суждению) не имеет отношения к проблеме, но чтобы избежать спины и четвертого, логика выглядит следующим образом:

.LDA 0220
.ASL
.BCC FA

Все это проверяет регистр, выполняет битовый сдвиг влево и переходит на адрес памяти FA, если флаг состояния установлен правильно, если нет, он возвращается к .LDA и снова проверяет регистры.

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

Если моя математика подтвердится, я получу 16 280 рекурсивных вызовов, прежде чем python просто остановится и через 3 секунды или около того просто вернется в командную строку.

Я сделал sys.setrecursionlimit(self.dotcount*self.linecount) в грязной попытке увеличить предел рекурсии, и цель здесь состояла в том, чтобы иметь возможность выполнить 81 600 рекурсий (340x240 пикселей, один рекурсивный вызов на пиксель округлым) .

в соответствии с Какова максимальная глубина рекурсии в Python и как ее увеличить? Это плохая идея, так как фреймы довольно большие, поэтому моя попытка исправить это была:

for tb in inspect.stack():
    tb.frame.clear()

Я также пытался (без преобладания) использовать traceback.clear_frames(tb).
Тупик поражает меня RuntimeError: cannot clear an executing frame.

Мое последнее средство / вопрос: возможно ли уменьшить время выполнения, чтобы учесть более рекурсивные вызовы, которые, как я знаю, имеют счастливый конец? Я не вижу, что у меня даже почти не хватает оперативной памяти, а приложение не работает даже близко к заметно медленному (в какой-то момент я ожидал замедления) .

Если это так, как освободить трассировку стека или увеличить глубину рекурсии?

1 Ответ

0 голосов
/ 15 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...