Почему PyPy переводит так медленно? - PullRequest
9 голосов
/ 27 мая 2011

Требуется несколько часов, чтобы перевести реализацию pypy в файлы c и собрать pypy-c на современном ноутбуке с 2G mem и процессором Intel Core2 2 ГГц.

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

1 Ответ

12 голосов
/ 27 мая 2011

Отказ от ответственности: я не эксперт по 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 зарезервирован для более мощных компьютеров. Если есть что-то, что может существенно улучшить эти времена, посторонние, как мы, вряд ли найдут это. Я бы оставил это беспокойство разработчикам.

...