Методы оптимизации в Python

Недавно я разработал приложение для биллинга для своей компании с Python/Django. В течение нескольких месяцев все было хорошо, но теперь я наблюдаю, что производительность снижается из-за того, что все больше пользователей используют эти приложения. Теперь проблема в том, что приложение сейчас очень важно для финансовой команды. Теперь финансовая команда после моей жизни справляется с проблемой производительности. У меня нет другого выбора, кроме как найти способ повысить производительность биллингового приложения.

Итак, вы, ребята, знаете какие-либо методы оптимизации производительности в python, которые действительно помогут мне с проблемой масштабируемости.

Ребята, мы используем базу данных mysql и размещаем ее на веб-сервере apache на Linux-боксе. Во-вторых, я заметил, что все приложения работают медленно, а не транзакционная часть базы данных. Например, как только приложение загружается, оно работает нормально, но если они переходят к другой ссылке в этом приложении, это занимает много времени.

И да, мы используем HTML, CSS и Javascript

Ответ 1

Удивительной особенностью Python является то, что пифонический код достаточно эффективен... Итак, несколько общих советов:

  • По возможности использовать встроенные и стандартные функции, они уже довольно хорошо оптимизированы.
  • Попробуйте использовать ленивые генераторы вместо одноразовых временных списков.
  • Используйте numpy для векторной арифметики.
  • Используйте psyco, если вы используете 32-разрядную версию x86.
  • Напишите критические критические характеристики производительности на языке более низкого уровня (C, Pyrex, Cython и т.д.).
  • При вызове того же метода коллекции объектов, получите ссылку на функцию класса и используйте ее, она сохранит поисковые запросы в словарях объектов (это микро-оптимизация, не уверена, что она стоит)

И, конечно же, если важна масштабируемость:

  • Используйте алгоритмы O(n) (или лучше)! В противном случае ваша система не может быть линейно масштабируемой.
  • Введите код, поддерживающий многопроцессор. В какой-то момент вам нужно будет использовать больше вычислительной мощности, и ваше программное обеспечение должно быть готово к его использованию.

Ответ 2

Как я уже сказал в комментарии, вы должны начать с нахождения какой-то части вашего кода.

Никто не может помочь вам без этой информации.

Вы можете профилировать свой код с помощью Python profilers, а затем вернуться к нам с результатом.

Если это веб-приложение, первым подозреваемым обычно является база данных. Если это приложение с интенсивным вычислением, то сначала посмотрите сначала на вычисления algo.

Но помните, что перфекционные проблемы автомобиля были крайне неинтуитивными, и поэтому объективная оценка - единственный способ пойти.

Ответ 3

ОК, не совсем так, но прежде чем вы начнете его исправлять, убедитесь, что все понимают ситуацию. мне кажется, что они оказывают определенное давление на вас, чтобы исправить "проблему".

Хорошо, прежде всего, когда вы написали приложение, указали ли они требования к производительности? они сказали вам, что им нужна операция X, чтобы выполнить меньше, чем Y секунд? Они указали, сколько одновременных пользователей должно поддерживаться без штрафа за производительность? Если нет, то попросите их отступить и что это итерация (этап, этап, что бы то ни было) была одной из задач развертывания, и главной целью была функциональность и тестирование. второй этап - улучшение производительности. пусть они (с вашей помощью, очевидно) придумают некоторые не функциональные требования к производительности вашей системы.

выполняя все это: а) вы устраните давление, прилагаемое финансовой командой (и я знаю, что они могут быть настоящей болью в заднице). b) у вас и ваших клиентов будет четкое представление о том, что вы означает "производительность". c) у вас будет база, в которой вы можете измерить свой прогресс и, самое главное, d) у вас будет определенное время для выполнения/устранения проблем с производительностью.

PS. что в стороне, посмотрите на индексацию...:)

Ответ 4

прежде чем вы сможете "исправить" что-то, что вам нужно знать, что "сломано". В разработке программного обеспечения это означает профилирование, профилирование, профилирование. Я упоминал профилирование. Без профилирования вы не знаете, где идут циклы процессора и время настенных часов. Как и другие пользователи, чтобы получить более полезную информацию, вам необходимо опубликовать детали всего вашего стека. Python, то, что вы используете для хранения данных в (mysql, postgres, плоские файлы и т.д.), Какой интерфейс веб-сервера cgi, fcgi, wsgi, пассажир и т.д., Как вы генерируете HTML, CSS и предполагаете Javascript. Затем вы можете получить более конкретные ответы на эти уровни.

Ответ 5

Вам может быть интересно этот документ, который я нашел некоторое время назад. Как личный совет, будьте как можно более питоничны: ленивая оценка - это ключевое слово, поэтому научитесь использовать итераторы и генераторы.

Ответ 6

Для типа приложения, которое вы описываете (веб-приложение, возможно, поддерживаемого базой данных), ваши проблемы с производительностью вряд ли будут специфичными для языка. Они гораздо более вероятны из-за проблем с дизайном или архитектурой, хотя они также могут быть простыми проблемами с кодированием.

Чтобы отсортировать это, вам нужно выяснить, где узкие места находятся в вашем приложении, и для этого вам нужен какой-то профайлер.

Как только вы найдете свои узкие места, вы окажетесь в гораздо лучшем положении. Вы можете оценить тогда проблемные области для общих проблем, включая:

Специфика любого решения будет зависеть от особенностей узких мест вашей находки.

Ответ 7

http://wiki.python.org/moin/PythonSpeed/PerformanceTips

Я оптимизировал некоторый код python некоторое время назад, самая удивительная вещь для меня заключалась в том, сколько стоит стоимость каждой функции. Если вы минимизируете вызовы функций или заменяете контуры встроенными функциями, вы будете работать намного быстрее.

Ответ 8

Здесь есть несколько замечательных предложений... Поэтому позвольте мне предложить детали реализации. Я нашел команду runprofileserver, найденную в django-command-extensions, очень удобную для профилирования моего кода Django.

Ответ 9

Я не уверен, что это решит проблему, но вы должны взглянуть на psyco