Почему PyPy переводит так медленно?

#pypy

#pypy

Вопрос:

Перевод реализации pypy в файлы c и сборка pypy-c на современном ноутбуке с 2G mem и процессором Intel Core2 2GHz занимает часы.

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

Ответ №1:

Отказ от ответственности: Я не эксперт по PyPy — в частности, я не разбираюсь в деталях перевода RPython, я только цитирую документы и то, что подслушал в списке рассылки и в блоге.

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

  1. Он начинает выполнять код Python в обычном режиме, например, импортируя модули, выполняя определения переменных на уровне модуля, определяя функции и классы, применяя к ним декораторы и т.д. В какой-то момент, когда должна быть достигнута «достаточная статичность», он останавливается и продолжает фактический процесс перевода.
  2. Он берет замороженную в памяти незавершенную программу Python и запускает все это в специальном объектном пространстве, которое имитирует управление потоком, возможные значения переменных и т.д. По сути, это символический запуск интерпретатора! Это делается для выполнения вывода типа (все, что угодно, но не просто на таком языке, как Python) и дополнительного анализа.
  3. Результаты преобразуются в низкоуровневый код.
  4. При необходимости следует множество оптимизаций (я бы предположил, что они включены по умолчанию) и сложное преобразование для поддержки без стекирования (я бы предположил, что по умолчанию они отключены).
  5. Затем он переводит все это в систему типов, которая соответствует назначенному бэкэнду, генерирует миллионы строк кода (из недавней записи в списке рассылки кажется, что существует по крайней мере 19 файлов .c, и по крайней мере один из них содержит по крайней мере 247 560 строк — просто чтобы вы имели представление о порядке величины, о котором мы говорим).
  6. Весь этот код скомпилирован с помощью gcc -O2 или аналогичного, что, конечно, требует большого разбора и проверки и само по себе требует множества этапов анализа и оптимизации.

Так что да, это чертовски СЛОЖНАЯ задача. Неудивительно, что ваш хилый процессор потерял. Для справки, ребята из PyPy использовали Intel Xeon W3580 (3,33 ГГц) при тестировании процесса перевода в ноябре 2010 года. Это все равно заняло у них около 76 минут, даже при том, что у них также было 12 ГБ оперативной памяти, что приводит к следующей проблеме: в процессе требуется много оперативной памяти (2,3 ГБ на 64-разрядной версии Ubuntu тогда, не знаю, как цифры переводятся в вашу ситуацию). Я почти уверен, что в конечном итоге вы превысите объем физической памяти — введите чрезмерную замену и связанный с этим удар в пах производительности.

Это, в сочетании с тем фактом, что у вас, вероятно, было несколько других запущенных программ, которые крали процессорное время и оперативную память, объясняет ваш опыт, на мой взгляд, довольно хорошо. Перевод PyPy зарезервирован для более мощных компьютеров. Если есть что-то, что может фундаментально улучшить эти времена, посторонние, такие как мы, вряд ли найдут это. Я бы оставил эти проблемы разработчикам.

Комментарии:

1. Спасибо за быстрый ответ. Поскольку у меня не так много памяти, я использую официальный python для запуска translate, что, вероятно, делает процесс даже более длительным, чем должно быть согласно документу, но я успешно собрал pypy на своей бедной машине.