Python и высокая нагрузка

Preview:

DESCRIPTION

Один из этапов поготовки к блиц-докладу. Пост-бета версия, очень слабо соотносится с релиз-кандидатом.

Citation preview

Python и высокая нагрузкаСледует ли использовать python там, где нужна

высокая нагрузка

Александр Шигин, shigin@rambler-co.ru

Rambler, 2009

Сильные стороны Python’а

высокая скорость разработки,библиотеки на все случаи жизни,можно использовать чуть ли не всевозможности OS,если что-то тормозит, из этого можносделать модуль на C,метапрограммирование.

Сильные стороны Python’а

высокая скорость разработки, но нам преждевсего нужна высокая скорость работы,библиотеки на все случаи жизни,можно использовать чуть ли не всевозможности OS,если что-то тормозит, из этого можносделать модуль на C,метапрограммирование.

Сильные стороны Python’а

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

Слабые стороны Python’а

отсутствие типизации,скорость работы,GIL.

Слабые стороны Python’а

отсутствие типизации, да, есть юнит-тесты,но скорость работы они не восполнят,скорость работы,GIL.

Слабые стороны Python’а

отсутствие типизации,скорость работы, python может (и частообыгрывает) другие скриптовые языки, нокомпилируемые языки находятся в другойлигеGIL.

Слабые стороны Python’а

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

А стоит ли?

Почти все преимущества Python’а направлены наудобную и быструю разработку, а не на скоростьработы.

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

Пару слов про GIL

Global Interpretor Lock включается для работыref-counter’а.

его можно

и нужно!

отключать во внешнихмодулях, пока мы не работаем сpython’овскими объектами;

а для скорости во внешних модулях не надоработать с python’овскими объектами.

Пару слов про GIL

Global Interpretor Lock включается для работыref-counter’а.

его можно и нужно! отключать во внешнихмодулях, пока мы не работаем сpython’овскими объектами;

а для скорости во внешних модулях не надоработать с python’овскими объектами.

Пару слов про GIL

Global Interpretor Lock включается для работыref-counter’а.

его можно и нужно! отключать во внешнихмодулях, пока мы не работаем сpython’овскими объектами;а для скорости во внешних модулях не надоработать с python’овскими объектами.

Чуть-чуть про объекты

Объекты — это такие специальные словари:при вызове метода каждый раз создаетсявременный объект,даже если мы пишем C-модуль, он всё равнотормозит при доступе к полям объекта,в вырожденных случаях, использованиевместо объекта tuple может ускоритьпрограмму в 2 раза,

словарь быстрее класса.

Чуть-чуть про объекты

Объекты — это такие специальные словари:при вызове метода каждый раз создаетсявременный объект,даже если мы пишем C-модуль, он всё равнотормозит при доступе к полям объекта,в вырожденных случаях, использованиевместо объекта tuple может ускоритьпрограмму в 2 раза,словарь быстрее класса.

Чуть-чуть про объекты

Не все так плохо:в 2.6 __slots__ дает приростпроизводительности,

но словарь все равнобыстрее

;

вы можете подумать про структуры на C...

Чуть-чуть про объекты

Не все так плохо:в 2.6 __slots__ дает приростпроизводительности, но словарь все равнобыстрее;

вы можете подумать про структуры на C...

Чуть-чуть про объекты

Не все так плохо:в 2.6 __slots__ дает приростпроизводительности, но словарь все равнобыстрее;вы можете подумать про структуры на C...

Чуть-чуть про boxing/unboxing

Например, мы решили использовать модуль array.мы здорово выиграли в памяти;но почти все наши обращения к массивузначительно медленнее, чем было до этого.

Почему?

Каждое обращение к ячейке массиваведет к созданию нового объекта.

Чуть-чуть про boxing/unboxing

Например, мы решили использовать модуль array.мы здорово выиграли в памяти;но почти все наши обращения к массивузначительно медленнее, чем было до этого.

Каждое обращение к ячейке массива ведет ксозданию нового объекта.

Запустим профайлер

Кривые руки detected

Запустим профайлер

обычно есть один тормоз,

который легкоможно ускорить

;

но остальные тормоза размазаны ровнымслоем по всей системе;я видел программу, которая 50% временипроводила в poll, но которую ускорили натреть.

Запустим профайлер

обычно есть один тормоз, который легкоможно ускорить;

но остальные тормоза размазаны ровнымслоем по всей системе;я видел программу, которая 50% временипроводила в poll, но которую ускорили натреть.

Запустим профайлер

обычно есть один тормоз, который легкоможно ускорить;но остальные тормоза размазаны ровнымслоем по всей системе;

я видел программу, которая 50% временипроводила в poll, но которую ускорили натреть.

Запустим профайлер

обычно есть один тормоз, который легкоможно ускорить;но остальные тормоза размазаны ровнымслоем по всей системе;я видел программу, которая 50% временипроводила в poll, но которую ускорили натреть.

Модуль на C

Я считаю рассуждения про функцию, котораявыполняется 80% времени мифом.

не надо думать, что переписав одну функциювы заставите остальное работать быстро;из-за python api вам придется переписыватьне только функцию, что чаще всеговызывается, но и все функции, которые еёвызывают.

Как результат...

о производительности надо думать заранее;

заранее представляя себе, что будетпереписано на C;избегайте python api во внешних модулях;смотрите на Cython,и внутрь numpy.

Как результат...

о производительности надо думать заранее;заранее представляя себе, что будетпереписано на C;

избегайте python api во внешних модулях;смотрите на Cython,и внутрь numpy.

Как результат...

о производительности надо думать заранее;заранее представляя себе, что будетпереписано на C;избегайте python api во внешних модулях;смотрите на Cython,

и внутрь numpy.

Как результат...

о производительности надо думать заранее;заранее представляя себе, что будетпереписано на C;избегайте python api во внешних модулях;смотрите на Cython,и внутрь numpy.

Recommended