2009-09-17 4 views
5

Psyco - специализированный компилятор для Python. documentation statesПочему Psyco использует много памяти?

Psyco может и будет использовать большое количество памяти.

Каковы основные причины использования этой памяти? Является ли существенная нехватка памяти особенностью компиляторов JIT в целом?

Редактировать: Спасибо за ответы. Есть три возможных соперника.

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

Вопрос заключается в том, какой из них является dominant фактор в использовании памяти? У меня есть собственное мнение. Но я добавляю щедрость, потому что я хотел бы принять ответ, который на самом деле правильный! Если кто-нибудь сможет продемонстрировать или доказать, где используется большая часть памяти, я соглашусь с ней. В противном случае тот, кого голосует сообщество, будет автоматически принят в конце щедрости.

ответ

2

Наверху памяти Psyco в настоящее время большой. С течением времени я немного сократился, но это все еще накладные расходы. Эти накладные расходы пропорциональны количеству кода Python, который Psyco перезаписывает; таким образом, если ваше приложение имеет несколько алгоритмических «основных» функций, это те, которые вы хотите, чтобы Psyco ускорялся - не вся программа.

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

10

С сайта psyco «Разница с традиционным подходом к компиляторам JIT заключается в том, что Psyco пишет несколько версий тех же блоков (блок - это немного функция), которые оптимизированы, специализируясь на некоторых видах переменные (а «вид» может означать тип, но это более общее) «

5

» Психо использует фактические данные во время выполнения, что манипулирует программу для записи потенциально несколько версий машинного кода, каждый по-разному специализированной для разных видов данных ». http://psyco.sourceforge.net/introduction.html

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

& dagger; Я никогда не заходил достаточно глубоко в Python, чтобы понять, имеет ли он или нет динамические типы или нет (типы, структура которых может быть изменена во время выполнения после того, как объекты были созданы с этим типом), или только общие реализации проверяют только типы во время выполнения; большинство статей просто в восторге от динамической типизации, фактически не определяя ее в контексте Python.

+4

Приятное использование и кинжала для реализации правильной нотной заметки! – unwind

+0

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

+0

Это изменяет существующие объекты с этим классом или только новые, созданные после перезагрузки? –

2

Определенно использование памяти psyco происходит из скомпилированных блоков ассемблера. Иногда Psyco страдает от сверхспециализации функций, что означает наличие нескольких версий блоков ассемблера . Кроме того, что также очень важно, psyco никогда не освобождает выделенные блоки ассемблера , даже если связанный с ним код мертв.

Если вы запустите свою программу под Linux, вы можете посмотреть/proc/xxx/smaps, чтобы увидеть растущий блок анонимной памяти, который находится в разных регионах, чем куча. Это анонимно mmap'ed часть для записи ассемблера, который, конечно, исчезает при работе без psyco.

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