Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Python и высокая нагрузка
1. Python и высокая нагрузка
Следует ли использовать python там, где нужна
высокая нагрузка
Александр Шигин, shigin@rambler-co.ru
Rambler, 2009
2. Сильные стороны Python’а
высокая скорость разработки,
библиотеки на все случаи жизни,
можно использовать чуть ли не все
возможности OS,
если что-то тормозит, из этого можно
сделать модуль на C,
метапрограммирование.
3. Сильные стороны Python’а
высокая скорость разработки, но нам прежде
всего нужна высокая скорость работы,
библиотеки на все случаи жизни,
можно использовать чуть ли не все
возможности OS,
если что-то тормозит, из этого можно
сделать модуль на C,
метапрограммирование.
4. Сильные стороны Python’а
высокая скорость разработки, но адепты
функциональных языков утверждают, что
скорость разработки на функциональных
языках выше,
библиотеки на все случаи жизни,
можно использовать чуть ли не все
возможности OS,
если что-то тормозит, из этого можно
сделать модуль на C,
метапрограммирование.
6. Слабые стороны Python’а
отсутствие типизации, да, есть юнит-тесты,
но скорость работы они не восполнят,
скорость работы,
GIL.
7. Слабые стороны Python’а
отсутствие типизации,
скорость работы, python может (и часто
обыгрывает) другие скриптовые языки, но
компилируемые языки находятся в другой
лиге
GIL.
8. Слабые стороны Python’а
отсутствие типизации,
скорость работы,
GIL, это не такая большая проблема, как
многие думают, но это проблема.
9. А стоит ли?
Почти все преимущества Python’а направлены на
удобную и быструю разработку, а не на скорость
работы.
Если вы не хотите ставить десять серверов там,
где справятся три, выберите компилируемый
язык.
10. Пару слов про GIL
Global Interpretor Lock включается для работы
ref-counter’а.
его можно отключать во внешних
модулях, пока мы не работаем с
python’овскими объектами;
11. Пару слов про GIL
Global Interpretor Lock включается для работы
ref-counter’а.
его можно и нужно! отключать во внешних
модулях, пока мы не работаем с
python’овскими объектами;
12. Пару слов про GIL
Global Interpretor Lock включается для работы
ref-counter’а.
его можно и нужно! отключать во внешних
модулях, пока мы не работаем с
python’овскими объектами;
а для скорости во внешних модулях не надо
работать с python’овскими объектами.
13. Чуть-чуть про объекты
Объекты это такие специальные словари:
при вызове метода каждый раз создается
временный объект,
даже если мы пишем C-модуль, он всё равно
тормозит при доступе к полям объекта,
в вырожденных случаях, использование
вместо объекта tuple может ускорить
программу в 2 раза,
14. Чуть-чуть про объекты
Объекты это такие специальные словари:
при вызове метода каждый раз создается
временный объект,
даже если мы пишем C-модуль, он всё равно
тормозит при доступе к полям объекта,
в вырожденных случаях, использование
вместо объекта tuple может ускорить
программу в 2 раза,
словарь быстрее класса.
15. Чуть-чуть про объекты
Не все так плохо:
в 2.6 __slots__ дает прирост
производительности,
;
16. Чуть-чуть про объекты
Не все так плохо:
в 2.6 __slots__ дает прирост
производительности, но словарь все равно
быстрее;
17. Чуть-чуть про объекты
Не все так плохо:
в 2.6 __slots__ дает прирост
производительности, но словарь все равно
быстрее;
вы можете подумать про структуры на C...
18. Чуть-чуть про boxing/unboxing
Например, мы решили использовать модуль array.
мы здорово выиграли в памяти;
но почти все наши обращения к массиву
значительно медленнее, чем было до этого.
Почему?
19. Чуть-чуть про boxing/unboxing
Например, мы решили использовать модуль array.
мы здорово выиграли в памяти;
но почти все наши обращения к массиву
значительно медленнее, чем было до этого.
Каждое обращение к ячейке массива ведет к
созданию нового объекта.
22. Запустим профайлер
обычно есть один тормоз, который легко
можно ускорить;
23. Запустим профайлер
обычно есть один тормоз, который легко
можно ускорить;
но остальные тормоза размазаны ровным
слоем по всей системе;
24. Запустим профайлер
обычно есть один тормоз, который легко
можно ускорить;
но остальные тормоза размазаны ровным
слоем по всей системе;
я видел программу, которая 50% времени
проводила в poll, но которую ускорили на
треть.
25. Модуль на C
Я считаю рассуждения про функцию, которая
выполняется 80% времени мифом.
не надо думать, что переписав одну функцию
вы заставите остальное работать быстро;
из-за python api вам придется переписывать
не только функцию, что чаще всего
вызывается, но и все функции, которые её
вызывают.
27. Как результат...
о производительности надо думать заранее;
заранее представляя себе, что будет
переписано на C;
28. Как результат...
о производительности надо думать заранее;
заранее представляя себе, что будет
переписано на C;
избегайте python api во внешних модулях;
смотрите на Cython,
29. Как результат...
о производительности надо думать заранее;
заранее представляя себе, что будет
переписано на C;
избегайте python api во внешних модулях;
смотрите на Cython,
и внутрь numpy.