суббота, 4 февраля 2012 г.

Python. Ползаем быстро.

Всем привет.
Не далее чем несколько дней назад я получил интереснейший опыт. Опыт по оптимизации программ на Python.

Случилось все примерно так. Была мной написана некая программа в задачи которой входила обработка данных. Если быть еще точнее - обработка логов. Все работало отменно пока не попались ей в зубы достаточно нетривиальные данные. Жевала их программа аж трое суток а прожевать не смогла.

В общем подобный антирекорд ни разу меня не порадовал. И решил я заставить змея ползать пошустрей. По результатам профилирования получалось что тонкое место - постоянное сканирование массива. Когда количество элементов возрастало до десятков тысяч то скорость одного прохода падала на 4е(!) порядка. После трех дней проб и ошибок, испытания разных идей и способов ускорения в сухом остатке следующее.

1) медленно работает именно поиск в массиве.
2) сравнение строк работает быстро(предварительное хеширование не ускоряет)
3) основная проблема скорости - алгоритм

Не буду томить. Ускорить удалось примерно в 800 раз. В результате то что программа не успела сделать примерно за трое суток теперь делает за 4-5 минут. Хотя код здорово усложнился для восприятия. Да что там говорить совсем потерял ясность. Вывод неутешительный. Код простой и эффективный не совместимы.

Основное ускорение получилось за счет индексирования доступа к элементам массива. В моем случае они были сложные так что сделать это было относительно не сложно.

В остальном затруднительно дать какой то конкретный совет. Просто помните что основная проблема - массивы в цикле. Ну и алгоритм. То что просто для человека сложно для машины.

В общем питон ползает быстро, просто не заставляйте его плутать в лабиринте человеческих мыслей.

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

Отправить комментарий