SlideShare a Scribd company logo
Как Python стал делать
погоду в Яндексе
Руслан Гроховецкий
Разработчик справочных сервисов



Я.Субботник, Екатеринбург, 2 июля 2011 года
Как было
• XScript
• CORBA
• C++
• Perl
• Java
• — Ручку старого серванта не дёргать!


  2
Всё хорошо, но...




 3
Число сервисов растёт




 4
Дедлайны — поджимают

     — А-а-а-а-а-а!




 5
— Концепция поменялась!
Нужно быстро переделать




  6
Растёт и ширится инфраструктура




Нет отдельных частей, всё друг с другом связано
  7
В итоге

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




  8
Потому что

Делать и переделывать сервисы на «обычных»
языках и технологиях долго и накладно.




 9
Что нужно было сделать

Повысить производительность
и гибкость разработки




 10
Питон?
Дзен: язык специально спроектирован именно
  для продуктивности разработки
  и читаемости кода

Джанго: веб-фрейморк для перфекционистов с дедлайнами

Батарейки: много хороших библиотек

Мотивация: разработчики любят Питон

Перспективы: у Питона хорошие, растущее сообщество

  11
— А давайте на Django будем
быстрые прототипы делать?




 12
— Смотрите,
оно держит нагрузки!




 13
Яндекс.Питон

    Тесты                 
                              Погода

    Афиша                 
                              OpenId

    Расписания            
                              API Я.ру

    ЕГЭ                   
                              Интранет

    Спецпроекты событий   
                              Куча утилит

    Яндекс.Интернет       
                              + еще сервисы
                              в разработке,
                              следите за новостями
    14
import this #The Zen of Python

• Beautiful is better than ugly.
• Explicit is better than implicit.
• Simple is better than complex.
• …
• Readability counts.
• …
  15
DRY-принцип

    Do not Repeat Yourself

    Выносите отдельно всё что можно, если это упрощает код
         –   генераторы

         –   контекстные менеджеры

         –   декораторы

    Главное — сухо!


    16
Утиная типизация (duck typing)

                Если она
                  выглядит как утка,
                  и крякает как утка
                  — значит это утка.




 17
Генераторы
def parse_point(tree):
    for found in tree.xpath('//gml:featureMember'):
        try:
             name = found.xpath('.//addr:LocalityName')[0].text
        except IndexError:
             continue # нашли не город
        country = found.xpath('.//addr:CountryName')[0].text
        pos = found.xpath('.//gml:pos')[0].text
        lon, lat = tuple(map(Decimal, pos.split()))
        yield dict(country=country, name=name, lon=lon, lat=lat)

for city in parse_point(xml_tree):
    do_something(city[‘name’], city[‘country’])
    do_something_else(city[‘lon’], city[‘lat’])
  18
@декораторы
@responding_JSONP
@accepts_query
@cached_query
@fixing_wrong_query_layout
def suggest_cities(query, inverted_query, lang='ru'):
    '''Саджест. Ищет по названию города
    Возвращает JSONP с массивом найденных городов.'''
    return [{'geoid': location.slug,
              'city': location.name
            } for location in search_locations_for_suggest(
                              query, inverted_query, lang)]



  19
List comprehensions
@responding_JSONP
@accepts_query
@cached_query
@fixing_wrong_query_layout
def suggest_cities(query, inverted_query, lang='ru'):
    '''Саджест. Ищет по названию города
    Возвращает JSONP с массивом найденных городов.'''
    return [{'geoid': location.slug,
              'city': location.name
            } for location in search_locations_for_suggest(
                              query, inverted_query, lang)]



  20
@декораторы
def responding_JSONP(view):
    @wraps(view)
    def wrapper(request, *args, **kwargs):
        result = view(request, *args, **kwargs)
        if isinstance(result, HttpResponse):
            return result
        json_callback = request.GET.get('jsonp', 'jsonp')
        data = json.dumps(result)
        return HttpResponse(
            "%s(%s);" % (json_callback, data),
            mimetype='application/json; charset=utf-8',
        )
    return wrapper
  21
Контекстные менеджеры
with DistributedLock('my_lock') as lock:
    if lock: # если лок взялся
        do_something() # выполнится только на одной машине
# после выхода из блока with лок сам снялся
# или лок на целую функцию, с помощью декоратора
@distributed_locked('my_lock')
def my_routine():
    do_something()
    do_something_else()
  22
Питон для шелл-скриптинга
for directory in os.listdir(workdir):
    xml_name = os.path.join(workdir, directory, 'climate.xml')
    with elementflow.xml(open(xml_name, 'w'), 'climate') as xml:
        with xml.container('charts'):
            subpath = os.path.join(workdir, directory)
            for filename in sorted(os.listdir(subpath)):
                if filename.endswith('.png'):
                    crop(os.path.join(workdir, directory, filename))
                    xml.element('chart', text=filename)




   23
Генерация XML на лету
for directory in os.listdir(workdir):
    xml_name = os.path.join(workdir, directory, 'climate.xml')
    with elementflow.xml(open(xml_name, 'w'), 'climate') as xml:
        with xml.container('charts'):
            subpath = os.path.join(workdir, directory)
            for filename in sorted(os.listdir(subpath)):
                if filename.endswith('.png'):
                    crop(os.path.join(workdir, directory, filename))
                    xml.element('chart', text=filename)




   24
Интернационализация
locale/LC_MESSAGES/be/django.po
# ru: "полупрозрачная облачность"
#: common/weather/__init__.py:147
msgid "thin high clouds"
msgstr "напаўпразрыстая воблачнасць"


# ru: "туман"
#: common/weather/__init__.py:148
msgid "fog"
msgstr "туман"
   25
Интернационализация
common/weather/conditions.py
from django.utils.translation import ugettext_noop as _
_('thin high clouds')
_('fog')
_('chance of show')
_('chance of hail')
#...
somewhere/generate.py
from django.utils.translation import ugettext as _
xml.element('weather_type',
            text=_(weather.condition, lang))

   26
ORM
Location.objects.filter(climate__isnull=False,

                 factual__temperature__range=[30, 35],

                 factual__water_temperature__gte=25)

                .exclude(country__in=[u'Египет', u'Турция'])

                .order_by('-weight')




  27
Батарейки




 28
import antigravity




                     29
Резко, неожиданно...
Повышаем производительность разработки за счет того, что кто-
  то уже разработал большие части за нас.




  30
Встроенные
•   ширпотреб: re, difflib, datetime, codecs, itertools, …
•   веб: urllib2, httplib, cookielib, BaseHTTPServer, …
•   скриптинговые: os, shutil, argparse, optparse, logging, configparser, …
•   структуры и алгоритмы: collections, queue, heap, bisect, …
•   ОС-ные, оболочные: windows, posix, macOS, TK, …
•   IPC, sockets: subprocess, socket, eventlib, …
•   протоколы: email, json, mimetools, mailbox, base64, uu, fptlib, poplib, …
•   звуковые: audioop, wave, chunk, …
•   локализация, интернационализация: gettext, locale, …
•   парсерные: code, parser, tokenizer, …
•   документация, тесты: pydoc, doctest, unittest, …
•   отладка и профилирование: pdb, ipdb, hotshot, …
    31
Сторонние
• БД: mysql, postgressSQL,

• XML: ElementTree, beautifulsoup, lxml, elementflow

• Фреймворки: django, pyramid, twisted, SQLAlchemy, web.py,
  WebOb, tornado, jinja2

• Картинки: PIL (Python Imaging Library), ImageMagick,

• Мозги: NumPy, SciPy, Python(x, y), PyGSL, OpenOpt, matplotlib,
  SymPy, NLTK, ...

• Тысячи их…
  32
Вставляем батарейки
$> easy_install название батарейки




 33
IDE — это важно
— Я привык к клёвым штукам моего Эклипса (Зенд Студио)




  34
PyCharm




 35
Питон не тормозит!



 36
— Но ведь Си работает быстрее
Вспоминаем, какую проблему в первую очередь решаем?
  Скорость разработки, а не работы кода.




  37
«Преждевременная
оптимизация...
...это корень всех зол»




 38
Нагрузочное тестирование




      Иллюстрация из презентации Андрея Кузмичева «Танки в Лунапарке»
 39
Библиотеки, написанные на С
lxml — скоростной парсинг и генерация XML

NumPy — числодробилка, обработка больших N-мерных массивов




  40
Профилирование
Найдите 1% кода, который стоит переписать




  41
Кэширование
Ваш код на Питоне является частью общей архитектуры,
  и кеширование — тоже элемент её.

from django.views.decorators.cache import cache_page


@cache_page(60 * 15)
def my_view(request):
    ...


  42
Совсем критическую часть кода
можно переписать на C/С++
Это требуется очень редко

Cython

Boost.Python




  43
Архитектура Я.Погоды



 44
Большая погода снаружи
3 млн посетителей в день
7,5 млн хитов в день
7538 городов в 226 странах
≈40 тыс. уникальных страниц




  45
И это тоже все погода
• Мини-погода
• Бары
• Виджеты
• Информеры
• Карты
• Телевизоры
• Мобильные сайты и приложения
• Тема для Я.Почты
  46
Поставщики
«Метеоновости» → “Foreca” → ?




 47
Логика на стороне Яндекса
• Предупреждения
• Сборка факта
• Ночь после дня




  48
Требования
• Масштабируемость

• Отказоустойчивость

• Работа в нашей кластерной инфраструктуре




  49
Решение
Xscript

   динамический фронт-энд с кешированием

Python + Django

   Бек-энд, генерирует статичные XML с погодой

   Несколько динамических http-ручек и информеры



   50
Поставщик

   Общая архитектура




                                                            cron




                                                                        P)
                                                                         T
                                                                      HT
                                                                    L(
               XScript    Django




                                                                   XM
запрос                                 Импорт прогнозов
              frontend                     (раз в час)
              (кластер)   backend     Импорт наблюдений
                          (кластер)      (раз в 10 минут)                        DB
  HTML          XML                                                             master
                 с                        Генерация
              погодой                   погодных XML
                                         (раз в 10 минут)

                                                                                slave
                                          Генерация                               1
                                       списков городов
запрос                                    (раз в сутки)
                                                                                slave
               Django                  Импорт городов                             2
                           геобаза      (метаданные)                              …
              frontend                    (раз в сутки)
              (кластер)
PNG, JSON
                                                                                slave
                                                                                  N
         51
PIL для генерации информеров




 52
Я.Погода
сегодня и завтра



 53
Увеличили
… число городов в три раза, с 2500 до 7538




  54
Ускорили
Одновременно с этим ускорили доставку погоды от поставщика
  до экрана с 30 до 5 минут*

* для городов, которые интересуют 98% посетителей




   55
Перевели

           Украинский
           Беларусский
           Казахский
           Татарский
           ...


 56
У Питона есть будущее



 57
Популярность С++
                   TIOBE Programming
                   Community Index
                   на июнь 2011




 58
Популярность Java
                    TIOBE Programming
                    Community Index
                    на июнь 2011




 59
Популярность Perl
                    TIOBE Programming
                    Community Index
                    на июнь 2011




 60
Популярность Питона растёт
                        TIOBE Programming
                        Community Index
                        на июнь 2011




 61
Академизация Питона




 62
Развитие Джанго
2005 — 0.90

2006 — 0.95

2007 — 0.96

2008 — 1.0

2009 — 1.1

2010 — 1.2

2011 — 1.3 (Сейчас в транке 1.4 pre-alpha)

  63
Python 3
• Кое-что причесали в ситаксисе
  • print «Hello, world» → print («Hello world»)
• Кое-что в библиотеках
  • dict.iterkeys() → dict.keys()
  • итераторы повсюду
• Причесали юникод
  • str → bytes, unicode → string,
  • строковые литералы по умолчанию юникодные




  64
Ссылки
docs.python.org
djangoproject.com
code.djangoproject.com/wiki/Tutorials
habrahabr.ru/blogs/python/
softwaremaniacs.org/
webnewage.org
www.doughellmann.com/PyMOTW/
yandex.ru/yandsearch?text=python
  65
Книжки




 66
Найдите 30 минут
и пройдите туториал
djangoproject.com




  67
Руслан Гроховецкий
Разработчик справочных сервисов
ruguevara@yandex-team.ru

More Related Content

What's hot (20)

PDF
Ян Габис - RobotFramework: автоматизированое тестирование для всех
Minsk Linux User Group
 
PDF
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Python Meetup
 
PDF
"Внутренности" CPython, часть II
Python Meetup
 
PPTX
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Ontico
 
PPTX
Django: инструкция по применению
Ivan Kolodyazhny
 
PPTX
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python Meetup
 
PPTX
Andrew Aksyonoff "Архитектура вокруг поиска"
Fwdays
 
PPTX
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Ontico
 
PDF
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Ontico
 
PDF
Вячеслав Бахмутов
CodeFest
 
PDF
Введение в потоки питона
Andrey Niahajchyk
 
PDF
Олег Бартунов и Иван Панченко
CodeFest
 
PPTX
Опыт эксплуатации большого проекта на Ruby
Alex Chistyakov
 
PDF
Денис Иванов
CodeFest
 
PDF
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Ilyas Salikhov
 
PPTX
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Stas Vyschepan
 
PDF
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Badoo Development
 
PPTX
Как собирать gps треки раз в секунду, экономя траффик
Andrew Minkin
 
PDF
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Ontico
 
ODP
Top10 доводов против языка Ruby
guest5f907e
 
Ян Габис - RobotFramework: автоматизированое тестирование для всех
Minsk Linux User Group
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Python Meetup
 
"Внутренности" CPython, часть II
Python Meetup
 
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Ontico
 
Django: инструкция по применению
Ivan Kolodyazhny
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python Meetup
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Fwdays
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Ontico
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Ontico
 
Вячеслав Бахмутов
CodeFest
 
Введение в потоки питона
Andrey Niahajchyk
 
Олег Бартунов и Иван Панченко
CodeFest
 
Опыт эксплуатации большого проекта на Ruby
Alex Chistyakov
 
Денис Иванов
CodeFest
 
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Ilyas Salikhov
 
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Stas Vyschepan
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Badoo Development
 
Как собирать gps треки раз в секунду, экономя траффик
Andrew Minkin
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Ontico
 
Top10 доводов против языка Ruby
guest5f907e
 

Similar to Руслан Гроховецкий "Как Python стал делать погоду в Яндексе" (20)

PPTX
Little Service in 2h
Alexei Yuzhakov
 
ODP
Python & Web: От простого к сложному
Ilya Bolkhovsky
 
PPT
Django шахрай. версия 4
smikler
 
PPT
Py con 2010_django_project_dev_full_circle
Rostislav Bryzgunov
 
PDF
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Ontico
 
PDF
Flask как хорошее решение для веб проекта
Python Meetup
 
PDF
Framework Battle: Django vs Flask vs Chalice
STEP Computer Academy (Zaporozhye)
 
PDF
django cheBit'11
dva
 
PDF
Что нового в Django 1.4
Илья Барышев
 
PDF
Михаил Трошев "AJAX в поиске по вебу"
Yandex
 
PDF
Sivko
kuchinskaya
 
PDF
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Александр Егурцов
 
PDF
Алексей Захаров "Архитектура Яндекс.Фоток"
Yandex
 
PDF
Python и Django – платформа для фрилансера
Alexander Koshelev
 
PPTX
Web осень 2013 лекция 9
Technopark
 
PDF
Юрий Буянов «Архитектура Goozy»
e-Legion
 
PDF
YuryByyanov (e-legion) @ CodeCamp2011
CodeCamp
 
PDF
Лекция #6. Введение в Django web-framework
Яковенко Кирилл
 
PDF
Psgi app
und3f
 
Little Service in 2h
Alexei Yuzhakov
 
Python & Web: От простого к сложному
Ilya Bolkhovsky
 
Django шахрай. версия 4
smikler
 
Py con 2010_django_project_dev_full_circle
Rostislav Bryzgunov
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Ontico
 
Flask как хорошее решение для веб проекта
Python Meetup
 
Framework Battle: Django vs Flask vs Chalice
STEP Computer Academy (Zaporozhye)
 
django cheBit'11
dva
 
Что нового в Django 1.4
Илья Барышев
 
Михаил Трошев "AJAX в поиске по вебу"
Yandex
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Александр Егурцов
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Yandex
 
Python и Django – платформа для фрилансера
Alexander Koshelev
 
Web осень 2013 лекция 9
Technopark
 
Юрий Буянов «Архитектура Goozy»
e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
CodeCamp
 
Лекция #6. Введение в Django web-framework
Яковенко Кирилл
 
Psgi app
und3f
 
Ad

More from Yandex (20)

PDF
Предсказание оттока игроков из World of Tanks
Yandex
 
PDF
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Yandex
 
PDF
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Yandex
 
PDF
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Yandex
 
PDF
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Yandex
 
PDF
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Yandex
 
PDF
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Yandex
 
PDF
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Yandex
 
PDF
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Yandex
 
PDF
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Yandex
 
PDF
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Yandex
 
PDF
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Yandex
 
PDF
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
PDF
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Yandex
 
PDF
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Yandex
 
PDF
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Yandex
 
PDF
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Yandex
 
PDF
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Yandex
 
PDF
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Yandex
 
PDF
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Yandex
 
Предсказание оттока игроков из World of Tanks
Yandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Yandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Yandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Yandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Yandex
 
Ad

Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"