Всем привет.
Не далее чем несколько дней назад я получил интереснейший опыт. Опыт по оптимизации программ на Python.
Случилось все примерно так. Была мной написана некая программа в задачи которой входила обработка данных. Если быть еще точнее - обработка логов. Все работало отменно пока не попались ей в зубы достаточно нетривиальные данные. Жевала их программа аж трое суток а прожевать не смогла.
В общем подобный антирекорд ни разу меня не порадовал. И решил я заставить змея ползать пошустрей. По результатам профилирования получалось что тонкое место - постоянное сканирование массива. Когда количество элементов возрастало до десятков тысяч то скорость одного прохода падала на 4е(!) порядка. После трех дней проб и ошибок, испытания разных идей и способов ускорения в сухом остатке следующее.
1) медленно работает именно поиск в массиве.
2) сравнение строк работает быстро(предварительное хеширование не ускоряет)
3) основная проблема скорости - алгоритм
Не буду томить. Ускорить удалось примерно в 800 раз. В результате то что программа не успела сделать примерно за трое суток теперь делает за 4-5 минут. Хотя код здорово усложнился для восприятия. Да что там говорить совсем потерял ясность. Вывод неутешительный. Код простой и эффективный не совместимы.
Основное ускорение получилось за счет индексирования доступа к элементам массива. В моем случае они были сложные так что сделать это было относительно не сложно.
В остальном затруднительно дать какой то конкретный совет. Просто помните что основная проблема - массивы в цикле. Ну и алгоритм. То что просто для человека сложно для машины.
В общем питон ползает быстро, просто не заставляйте его плутать в лабиринте человеческих мыслей.
суббота, 4 февраля 2012 г.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий