2016-04-28 11 views
2

Рассмотрим следующий фрагмент кода:PyPy JIT вызова оптимизации

class Duck: 
    def duck(self): 
     pass 

ducks = [Duck() for i in range(10)] 
for duck in ducks: 
    duck.duck() #<----- 

Будет duck.duck() вызова динамически переданную (т.е. каждый раз, когда поиск метод будет сделано), или JIT сможет вычесть, что мы итерируем стабильный список уток и заменяем вызовы с помощью mem + offset?

Если да, то как я могу сам это увидеть (например, как проверить IR-код, если есть какая-либо или сгенерированная сборка); если нет, то почему?

+0

Это трассировка JIT, поэтому цикл превратится в «проверьте, что тип« утка »-« Утка », а затем больше ничего не делает (метод встроен)». –

ответ

2

Люди в команде PyPy работают над разумным способом, чтобы сделать это для внешних людей. В то же время, вот инструкции для текущего способа просмотра IR (и, возможно, машинного кода), созданного компилятором JIT.

Эти инструкции были протестированы в Linux. Они также должны работать на OS/X. Для Windows вам необходимо адаптировать синтаксис большинства команд, как обычно.

  • проверить копию основного хранилища PyPy (требуется много времени!): Например. для 5.x выпусками, hg clone https://bitbucket.org/pypy/pypy -r release-5.x -u release-5.x pypysrc

  • установить https://bitbucket.org/pypy/jitviewer для PyPy (обычно мы делаем это, проверяя его с hg clone https://bitbucket.org/pypy/jitviewer, а затем virtualenv -p pypy pypy-venv; . pypy-venv/bin/activate; cd /path/to/jitviewer; pypy setup.py install)

  • запустить пример программы, как это: PYPYLOG=jit:log pypy mytest.py; это создает файл под названием log

  • просмотреть журнал, начав PYTHONPATH=/path/to/pypysrc jitviewer.py --log log, а затем просмотреть URL-адрес на http://127.0.0.1:5000/.