Почему Psyco использует много памяти? - PullRequest
5 голосов
/ 17 сентября 2009

Psyco - это специализированный компилятор для Python. Документация гласит

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 17 сентября 2009

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

5 голосов
/ 17 сентября 2009

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

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

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

2 голосов
/ 23 октября 2009

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

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

2 голосов
/ 17 сентября 2009

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

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

...