LINUX.ORG.RU

Избранные сообщения SevikL

Эффективная оптимизация. Что такое Cython.

Форум — Development

За последнюю неделю почему-то часто всплывал этот вопрос, поэтому распишу всё сразу в одном месте. Описывать буду на примере питона, но общие принципы применимы ко многим языкам. Итак.

Часть первая. Правила эффективной оптимизация

  1. Не думайте об оптимизации пока код не дописан. Вообще! Думайте, как написать код проще и понятнее. А про оптимизацию даже не вспоминайте, пока не запустите код. Когда код запустится, проверьте насколько быстро он отрабатывает. Если он достаточно быстр — задача решена, ничего делать не нужно. Точка. И только если код отрабатывает медленнее, чем требуют условия задачи — начинайте думать об оптимизации.
  2. Попробуйте JIT, например PyPy, если условия это позволяют (apt-get install pypy && pypy yourprogram.py). Когда не хватает совсем немного производительности — JIT ускорит в несколько раз, и этого может быть достаточно. И тогда всё, задача решена. Только если это не сработало, переходите к фактической оптимизации кода.
  3. Пройдитесь профайлером. python -m cProfile yourprogram.py Никогда не оптимизируйте код без профилирования. По профилю определите самые медленные куски кода. Если код слишком большой — разбейте на функции. Не нужно бросаться переписывать всё подряд. Изолируйте наиболее прожорливые куски кода, и работайте только с ними.
  4. Выполните высокоуровневую оптимизацию найденных медленных кусков кода. Используйте более быстрые библиотеки: gmpy2 вместо встроенной длинной арифметики, python-regex вместо встроенного re, numpy для матричных вычислений, и т.д. Замените dict на list. Вынесите все возможные вычисления за циклы. Наконец, оптимизируйте алгоритм, или попробуйте найти ему более быстрый аналог. Если что-то получилось — goto 2.
  5. Cython. Расставьте типы, пройдитесь профайлером, посмотрите annotate cython-а, какой код сгенерирован, какие куски можно ускорить (он их расцвечивает)... Ещё раз подчёркиваю, низкоуровневая оптимизация — это последний этап, когда другие варианты исчерпаны.

Часть вторая. Cython

Если мы всё-таки дошли до cython-а, то... что же он такое?

Cython - это транслятор из питона в Си. Всё. Он просто генерирует код на си.

Если в файле mymodule.py написать:

def somefunc(x):
    y = x*42
    return y
и запустить cython mymodule.py то он том же каталоге сгенерирует mymodule.c, в котором будет что-то вроде:
static PyObject *__pyx_pf_8mymodule_somefunc(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x) {
  PyObject *__pyx_v_y = NULL, *__pyx_r = NULL, *__pyx_t_1 = NULL;

  __pyx_t_1 = PyNumber_Multiply(__pyx_v_x, __pyx_int_42);
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_y = __pyx_t_1;
  __pyx_t_1 = 0;

  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_y);
  __pyx_r = __pyx_v_y;

  __Pyx_XDECREF(__pyx_v_y);
  __Pyx_XGIVEREF(__pyx_r);
  return __pyx_r;
}
И, хотя это редко делают вручную, этот код можно собрать обычным компилятором: gcc -shared -O3 -o mymodule.so mymodule.c `python-config --cflags --ldflags`. Нигде в остальном коде ничего менять не надо. Обычный «import mymodule» загрузит бинарный module.so так же, как загрузил бы питоновый mymodule.py.

Да, cython позволяет скомпилировать питонокод. Но никаких глубоких интеллектуальных оптимизаций cython не делает. Он просто вызывает из libpython.so питоновые функции, такие как PyNumber_Multiply(). Без питона этот код работать не будет. (в принципе, его можно собрать статически, но обычно это не имеет смысла — реальная программа всё равно будет использовать кучу внешних либ, и ещё одна библиотека роли не сыграет)

Так как все вызовы питоновых функций остались, то просто сборка cython-ом большого ускорения не даст, может, раза в два. Но! Cython-у можно указать, где использовать сишные типы вместо питоновых! В примере выше, если расставить типы:

cdef double somefunc(double x):
    cdef double y = x*42
    return y
то cython mymodule.pyx сгенерирует в mymodule.c код:
static double __pyx_f_8mymodule_somefunc(double __pyx_v_x) {
  double __pyx_v_y, __pyx_r;

  __pyx_v_y = (__pyx_v_x * 42.0);

  __pyx_r = __pyx_v_y;

  return __pyx_r;
}
По сути, это чистый код на си. Быстрее некуда. А с параметром --annotate cython -a mymodule.pyx дополнительно сгенерирует «mymodule.html», в котором раскрасит код цветами. По нему легко смотреть, какие части кода ещё стоит оптимизировать. Но так как после расстановки типов обычным питоном такой код уже не запустится, его традиционно сохраняют в файле с расширением .pyx вместо .py.

Вот так, не написав ни одной строчки на си, а просто расставив типы, медленный питоновый код превращается в быстрый сишный.

В целом, это всё.

PS: Это не все возможности cython-а. В нём можно использовать плюсовые типы, например std::vector. Причём можно даже писать: cdef vector[double] sqrs = [x*x for x in somelist] и всё преобразование из питоновых типов в плюсовые и обратно cython возмёт на себя. Можно вызывать и внешний код на си (cdef extern from).

Есть и более тонкие оптимизации, например мелким функциям можно расставлять inline (хотя с этим и gcc обычно справляется). А ещё код, не использующий питоновые объекты, не блокирует GIL! А значит отлично подходит для многопоточных вычислений. В cython-е есть и модули для параллельных вычислений.

Да и сами .pyx файлы обычно компилируются не руками, а как часть скрипта distutils/setuptool. А в отладочных целях import pyximport; pyximport.install() и после этого обычный import mymodule сможет импортировать не только .py, но и .pyx файлы.

Полезные ссылки

Итого: Оптимизировать надо только когда иначе нельзя, и только то, что необходимо. Низкоуровневая оптимизация делается в последнюю очередь. Но если мы её таки делаем, то cython позволяет сделать её максимально легко — просто расставив типы.

PPS: Питон в этом не уникален. Почти во всех языки есть возможности низкоуровневой оптимизации, расширения на си через FFI/JNI/и т.д. Есть unsafe код в rust и c#. Даже в паскале и си есть ассемблерные вставки. Не удивительно, что кто-то придумал аналог и для питона. Так что эти же принципы оптимизации применимы и к другим языкам.

 , , , ,

pynonymous ()

Вакансия DevOps Fulltime Москва-Сити

Форум — Job

Высоконагруженный проект, платформа мобильного телевидения https://vacancy.newhr.ru/devops/2

О проекте

  • Стриминг видео, проект на стыке онлайн-вещания и игровой механики
  • Сотни тысяч запросов в секунду. Пиковые нагрузки на аналогичные проекты в Штатах – 3,5 млн активных пользователей online
  • Стартап, дата запуска – осень 2018

О задачах

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

Хотим увидеть у вас

  • Опыт работы и глубокое понимание Linux систем, траблшутинг
  • Опыт с нагруженными системами, тюнинг производительности
  • Опыт работы с Nginx. Плюсом будет опыт с Haproxy
  • Опыт работы со средствами виртуализации и кластеризации, Docker, Docker Swarm
  • Автоматизация развертывания с помощью Ansible или аналогов
  • Опыт работы с системами мониторинга (такими как Icinga2 или Nagios)
  • Умение настроить БД: ProstgreSQL, Redis или другие NoSQL решения
  • Опыт работы с системами CI (в идеале Jenkins)

Важно

  • С момента запуска проекта первое время перейти на смещённый к вечеру рабочий день (~до 22-23), чтобы во время онлайн-эфиров быть в офисе.

Мы предлагаем

  • Уровень дохода 180-200 тыс.руб. net
  • Fulltime занятость, офис в Москва-Сити
  • Оформление через ИП или гражданско-правовой договор (все налоги оплачивает компания)
  • Оплачиваемые отпуска и больничные, ДМС после испытательного срока
  • Небольшая профессиональная команда
  • Возможность подключаться к другим проектам (кластер проектов)

По вопросам о компании и вакансии пишите нашему хантеру, Ксении, в почту ksenia@new.hr

Расскажем все важные детали, ответим на вопросы, выслушаем пожелания.

 , , ,

flaum ()

Вакансия: middle DevOps-инженер

Форум — Job

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

Вакансия: middle DevOps-инженер, открыта она в международной компании, которая специализируется на инновационных методах лечения зубов и исправления прикуса, основанных на высоких технологиях (3D-моделирование/печать, BigData и тд).Компания занимает лидирующие позиции в своем сегменте, представлена по всему миру. Хэдофис компании находится в Сан Хосе (Калифорния).

Обязанности:

  • Администрирование Linux-инфраструктуры;
  • Деплоймент и автоматизация выкатки приложений;
  • CI/CD;
  • Работа с облаками.

Требования:

  • Опыт системного администрирования Linux (от 2-ух лет);
  • Опыт написания скриптов для автоматизации задач системного администрирования/деплоя на Ruby, Python или Bash;
  • Опыт работы с Git.
  • Желание развиваться в сфере DevOps;
  • Английский язык на уровне не ниже Intermediate.

Будет плюсом:

  • Опыт работы с Chef/Ansible;
  • Опыт работы с Docker;
  • Опыт работы с Cloud-вычислениями (особенно AWS);
  • Понимание ELK.

Условия:

  • Официальное трудоустройство;
  • Реальные возможности карьерного/профессионального роста;
  • Расширенный социальный пакет, которые распространяется на на членов семьи сотрудника (полное медицинское страхование, корпоративные уроки английского, оплата фитнеса, дотации на питание и тд.);
  • Удобный офис на м.Тульская;
  • Перспектива релокации в Калифорнию.

Что касается заработной платы: мы ориентируемся на оклад в размере 100-160 тыс. рублей на руки (ЗП белая), готовы обсуждать.

Буду рад рассказать обо всем подробнее в случае вашей заинтересованности :)

Контакты:

  • e-mail: shatyrkin@ascr.ru
  • telegram: @egogogor

 , , , ,

Egogor ()

Некий учёт сетей и серверов

Форум — Admin

Привет, лор. У меня есть много разных серверов, и хотелось бы вести их учёт - то есть чтобы был некий холст, я расставляю там некие иконки с серверами, коммутаторами, и прочим, и добавляю к ним какую-то инфу :-) Вроде бы где-то видел такое. Можно и на бумаге, но неудобно.

Глупый вопрос, но буду рад если толкнёте куда нужно, спасибо. :-)

 

mahalaka ()

База электронных компонентов

Форум — Science & Engineering

Тут как-то CYB3R спрашивал про базу данных электронных компонентов. Мне вот сегодня пришла рассылка от сайта parts.io, на котором я когда-то давно зарегистрировался. Оказалось, это почти то, что интересовало CYB3R'а.

Для Ъ: довольно обширная база электронных компонентов с поиском по параметрам, по аналогам, с даташитами, ценами, рейтингом доставабельности и пр.

 

Puzan ()

Apt-get install Ваше приложение

Форум — Development

Доброго времени суток.

Есть следующее желание: написать веб-сервер на java, затем поднять его на Linux-оидной системе.

Поехали, пишем сервер, устанавливаем что-нибудь Linux-Овое, ставим на него джава-машину и ... И как? что делать дальше-то?

Каким путем пойти, чтобы прийти к установке своего сервера следующим путем:

apt-get install SMCServer-by-moe SMCServer-by-moe start

Пожалуйста, укажите необходимую литературу.

 , , ,

KovalchukAS ()

Как кошерно сохранить правила iptables?

Форум — General

Нужно, что бы правила iptables подгружались после перезагрузки. Скриптом из под из под хомяка не кошерно ведь?

Debian 8

 

Hi ()

Как ардуино/AVR оперирует int 16-bit, long 32-bit и float 32-bit? Всё чисто программное?

Форум — Development

https://learn.sparkfun.com/tutorials/data-types-in-arduino

Хотелось бы узнать у любителей AVR ASM'а как на самом низком уровне оперирует числами: у него реализован специальный аппаратный модуль для работы с int 16-bit, он программно эмулируется = тормзит?

float, я так понимаю, там только программный, верно?

 , , , ,

mklord ()

Как Вы изучали Java?

Форум — Development

Вопросы к Java-программистам. Как опытным, так и начинающим. Почему выбрали именно Java? Сколько времени вы потратили на изучение до уровня Java Junior Developer? Какими источниками обучения пользовались? Что посоветуете человеку, который только взялся как за Java, так и программирование в целом?

Перемещено mono из talks

 ,

kyka276 ()

Ссыль для борьбы с аудиодрочерами

Форум — Talks

Наткнулся тут на тест , которым можно кидаться в тех, кто «слышит явно разницу» между кастрированными форматами и православным flac, у кого «низы» не дотягивают, а «верха» песочат :)

За рекламу сервиса не считать, так как там написано, что он для РФ не робит.

 ,

gutaper ()