Обычные подозреваемые - профилируйте это, найдите самую дорогую линию, выясните, что она делает, исправьте это. Если вы раньше не выполняли много профилирования, могут быть большие жирные квадратичные циклы или дублирование строк, скрывающиеся за другими безобидно выглядящими выражениями.
В Python две наиболее распространенные причины неявного замедления, которые я обнаружил, - это конкатенация строк и генераторы. Поскольку строки Python являются неизменяемыми, выполните что-то вроде этого:
result = u""
for item in my_list:
result += unicode (item)
скопирует всю строку дважды за итерацию. Это было хорошо освещено, и решение состоит в том, чтобы использовать "".join
:
result = "".join (unicode (item) for item in my_list)
Генераторы - еще один преступник. Они очень просты в использовании и могут значительно упростить некоторые задачи, но плохо примененный генератор будет намного медленнее, чем просто добавление элементов в список и его возврат.
Наконец, не бойтесь переписывать биты в C! Python, как динамический язык высокого уровня, просто не способен соответствовать скорости Си. Если есть одна функция, которую вы больше не можете оптимизировать в Python, рассмотрите возможность ее извлечения в модуль расширения.
Моя любимая техника для этого - поддерживать версии модуля на Python и C. Версия Python написана так, чтобы быть максимально понятной и очевидной - любые ошибки должны легко диагностироваться и исправляться. Напишите свои тесты против этого модуля. Затем напишите версию C и протестируйте ее. Его поведение во всех случаях должно быть таким же, как и в реализации Python - если они различаются, должно быть очень легко выяснить, что является неправильным, и исправить проблему.