Pypy JIT дает повышение скорости, даже если скрипт запускается только один раз? - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть скрипт, который загружает несколько сотен изображений, изменяет их размер и затем формирует большее изображение

Каждый раз, когда запускается другой набор изображений:

python myscript.py imageFolder/

Запуск его вvirtualenv с Pypy не показывает заметного прироста скорости (все запускаются через ~ 8 секунд с mprofile, причем версия pypy тратит больше времени на PIL.resize и меньше на инициализацию пакетов).

Это потомуJIT дает преимущество только для длительных процессов?

Если это так, я могу преобразовать скрипт в демон (но я боюсь утечек памяти).

Ответы [ 2 ]

10 голосов
/ 16 декабря 2011

Из вашего описания видно, что PIL.resize() является доминирующей операцией.Эта функция написана на C, а не на Python.Поэтому я сомневаюсь, что вы можете ожидать, что PyPy окажет большое влияние на ваш скрипт.

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

1 голос
/ 16 декабря 2011

Для обработки изображений, похоже, что большая часть времени обработки в вашем скрипте тратится внутри функций обработки изображений PIL.

Они написаны в нативном коде и уже оптимизированы на полной нативной скорости - вы не получите много от перемещения частей контроллера Python (код, говорящий о том, какие изображения открывать и тому подобное - подумайте 10-20байты для имен файлов, по крайней мере, 10000 байт в каждом теле изображения).

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

...