Методы оптимизации в Python - PullRequest
11 голосов
/ 30 марта 2010

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

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

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

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

Ответы [ 9 ]

11 голосов
/ 30 марта 2010

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

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

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

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

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

6 голосов
/ 30 марта 2010

хорошо, не совсем точно, но прежде чем приступить к исправлению, убедитесь, что все понимают ситуацию. мне кажется, что они оказывают некоторое давление на вас, чтобы решить «проблему».

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

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

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

4 голосов
/ 30 марта 2010

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

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

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

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

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

1 голос
/ 30 марта 2010

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

0 голосов
/ 30 марта 2010

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

0 голосов
/ 30 марта 2010

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

0 голосов
/ 30 марта 2010

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

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

0 голосов
/ 30 марта 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...