Обновить
608.63

Python *

Высокоуровневый язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Centrifuge — я больше не буду обновлять страницу перед отправкой комментария

Время на прочтение10 мин
Количество просмотров26K
Прошло некоторое время с тех пор, как я писал про Центрифугу в предыдущий раз. Произошло множество изменений за этот период. Многое из того, что было описано в ранних статьях (1, 2) кануло в лету, но суть и идея проекта остались прежними — это сервер рассылки real-time сообщений пользователям, подключенным из веб-браузера. Когда на вашем сайте возникает событие, о котором вам нужно моментально сообщить некоторым вашим пользователям, вы постите это событие в Центрифугу, а она, в свою очередь, отправляет его всем заинтересованным пользователям, подписанным на нужный канал. В самом простом виде это показано на схеме:



Проект написан на Python с использованием асинхронного веб-сервера Tornado. Использовать можно даже если бекенд вашего сайта написан не на Python. Хотелось бы рассказать о том, что Центрифуга представляет собой на данный момент.
Читать дальше →

Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Время на прочтение20 мин
Количество просмотров85K
Пусть мы хотим вычислить десятимиллионное число Фибоначчи программой на Python. Функция, использующая тривиальный алгоритм, на моём компьютере будет производить вычисления более 25 минут. Но если применить к функции специальный оптимизирующий декоратор, функция вычислит ответ всего за 18 секунд (в 85 раз быстрее):


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

Эта статья расскажет о том, в каких случаях и каким образом декоратору удаётся делать подобные оптимизации. Также вы сможете сами скачать и протестировать библиотеку cpmoptimize, содержащую данный декоратор.
Читать дальше →

Python-digest #35. Новости, интересные проекты, статьи и интервью [27 июля 2014 — 03 августа 2014]

Время на прочтение4 мин
Количество просмотров14K

Дайджест был опубликован ранее, но определенным причинам был исключен с хабра, сейчас же было принято решение вернуть его обратно.
Очередной выпуск новостей из мира Python.
За иллюстрацию к посту, как и раньше, благодарим owlman75, а так же alrusdi за идею дайджестов и за то, что я по прежнему могу публиковать эти дайджесты для вас.
В этом выпуске у нас вот такие интересные новости собрались: свеженькие уязвимости в django, в релизах второй релиз кандидат Django 1.7, APScheduler 3.0, Pylint 1.3 / Astroid 1.2, django-extensions 1.3.9, boto 2.32.0 и еще много интересных библиотек и статей для изучения.
Перейти к дайджесту

Учим старую собаку новым трюкам или как я научился любить str.format и отказался от %

Время на прочтение7 мин
Количество просмотров64K
Предлагаю вниманию читателей хабры и поклонникам python перевод довольно объемной статьи о форматировании строк. Сказка будет правдивой и намек в ней будет на то, что консерваторам стоит иногда рассматривать что-то новое, даже если привычка упорно сопротивляется.

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

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

Уравнение или всё же наблюдение?

Время на прочтение6 мин
Количество просмотров20K


Запятошка: Устраивайся поудобнее, Жучок, мы будем с тобой сегодня проводить мысленные эксперименты со свободно падающими телами.
Жучок: А это как? Тела будут падать в моём воображении? Прямо так и вижу: обнажённые тела, летящие на фоне звёздного неба…
Запятошка: Тела, конечно, воображаемые, но не настолько большие, чтобы быть обнажёнными. Вообще, речь пойдёт о свободном падении тел в однородном гравитационном поле.
Вот как это выглядит в нашем проекторе снов

Впечатления от посещения EuroPython 2014

Время на прочтение14 мин
Количество просмотров12K
Одна из отличительных особенностей языка Python — это посвящённые этому языку конференции, так называемые PyConы. Не так давно мне удалось побывать на одном таком PyCon-е — EuroPython 2014. EuroPython — это одна из наиболее крупных европейских ежегодных конференций по языку Python, которая три последних года проводилась во Флоренции, а в 2014м — первый раз в Берлине. Пока свежи воспоминания решил написать небольшой отчётик — что и как было.
Читать дальше →

Вместе веселей: python + flask + google app engine

Время на прочтение6 мин
Количество просмотров29K
Предыстория: я, как и многие на Хабрахабре, чертовски люблю слушать музыку. Чаще всего делаю это в ВКонтакте. Иногда уже сфомированный плейлист надоедает — хочется чего-нибудь нового; но так, чтобы не сильно отличалось от того, что уже есть. Для этого на всех сервисах, предоставляющих возможность прослушивания музыки, существуют рекомендации. Признаюсь честно, рекомендации в ВКонтакте меня ужасают. Может кому-то нравится, но у меня тамошний подбор вызывает желание закрыть браузер (ИМХО, конечно). В общем, решил я эту ситуацию для себя исправить и реализовать свои собственные рекомендации с использованием API ВКонтакте и Last.fm. Так как я много слышал и читал про Google App Engine, но никогда его не использовал, решено было приобщиться к этой платформе.

Сразу скажу, что тонкости взаимодействия с API или алгоритм подбора рекомендаций здесь я описывать не буду. Об этом — в следующих статьях, может быть. В данной статье описан только процесс создания, настройки и деплоя приложения на платформе Google App Engine с использованием python и flask.
Об опечатках и неточностях просьба сообщать в личку. Спасибо.
Читать дальше →

Thunderargs: практика использования. Часть 2

Время на прочтение12 мин
Количество просмотров3.1K
История создания
Часть 1

Добрый день. Вкратце напомню, что thunderargs — библиотека, которая даёт использовать аннотации для обработки входящих аргументов.

Кроме того, она даёт возможность достаточно просто накидать гейт, который будет эти самые аргументы для функции вытаскивать откуда-нибудь ещё. Например, из объекта request во фласке. И в итоге мы вместо

@app.route('/ugly_calc', dont_wrap=True)
def ugly_calc():
    x, y = int(request.args['x']), int(request.args['y'])
    op_key = request.args.get('op')
    if not op_key:
        op_key = '+'
    op = OPERATION.get(op_key)
    return str(op(x, y))

делаем
@app.route('/calc')
def calc(x:Arg(int), y:Arg(int), op:Arg(str, default='+')):
    return str(OPERATION[op](x, y))


Думаю, все хотя бы примерно поняли о чём будет речь в статье. Всё, что в ней описано — размышления о будущем проекта и примерная расстановка «майлстоунов» по нему. Ну и, разумеется, первые наброски всяких-разных фич.

В этой части


  • Рассмотрим структурные изменения в проекте и пару критических ошибок в изначальной структуре
  • Разберёмся как работают валидаторы и как можно кастомизировать выдаваемые ими ошибки
  • Создадим зачатки специализированных аргументов (IntArg, StrArg, ListArg и так далее)
  • Подготовим класс, который будет автоматически вытаскивать объект из базы по id, поступившему в запросе
  • Будем генерировать точки входа по классу модели
  • Реализуем листенеры и посмотрим как можно сделать валидатор для нескольких аргументов
  • Убедимся, что информацию о структуре аргументов можно смело переносить в БД, и ничего нам за это не будет
  • И, наконец, порассуждаем о мелких интересностях, так и не реализованных в рамках этих экспериментов

Читать дальше →

Минималистичный issue tracker на Django

Время на прочтение11 мин
Количество просмотров19K
В этой статье рассказывается, как за короткое время решить с помощью фреймворка Django, простую, но интересную задачу: создание системы баг-трекинга (система тикетов) для своего проекта. Наша система будет интегрирована с системой аутентификации пользователей Django и административным интерфейсом. Несмотря на свою примитивность, такое приложение, при некотором усовершенствовании, вполне может быть полезно для разработчика-одиночки или небольшой группы.


Читать дальше →

Django 1.7

Время на прочтение1 мин
Количество просмотров21K
После почти года разработки вышел долгожданный релиз Django 1.7.
image
Ключевые изменения новой версии
  • Прекращена поддержка Python 2.6.
  • Добавлена поддержка миграций непосредственно в сам фреймворк. Здесь можно посмотреть инструкции о переходе с South.
  • Переработан механизм загрузки приложений. Теперь models.py — необязателен.
  • Изменения в Field API, в частности, добавлен обязательный метод deconstruct() для поддержки миграций.
  • Добавлена возможность вызова QuerySet напрямую из менеджера. Также теперь можно указывать необходимый менеджер при использовании связи между моделями.
  • Новая система для проверки проекта и диагностики ошибок, вместо validate добавлена команда check.
Читать дальше →

Приглашаем на Moscow Django MeetUp № 22

Время на прочтение3 мин
Количество просмотров5.4K


Дамы и господа, в четверг в офисе Mail.Ru Group пройдёт 22-я по счёту ежемесячная встреча Moscow Django MeetUp! В этот раз вы сможете услышать мудрые речи трёх докладчиков, которые выступят на сильно разные темы. В первых рядах выступающих окажется не кто иной, как Григорий Петров (Digital October).

Григорий регулярно выступает на конференциях не просто так. Он считает, что это приносит пользу не только сообществу разработчиков, но и ему самому. Специально для данного митапа Григорий подготовил доклад, в рамках которого вы услышите соображения программиста о публичных выступлениях, силе воли, нужности презентации и ключевой роли гипокампа в профессиональном росте айтишника. Доклад разбит на три части:
Читать дальше →

Python, каким бы я хотел его видеть

Время на прочтение11 мин
Количество просмотров46K
Всем известно, что мне не нравится третья версия Python и то, в каком направлении развивается этот язык программирования. За последние несколько месяцев я получил много писем с вопросами о моём видении развития Python и решил поделиться своими мыслями с сообществом, чтобы, по возможности, дать пищу для размышлений будущим разработчикам языка.

Можно сказать совершенно точно: Python не является идеальным языком программирования. На мой взгляд, основные проблемы вытекают из особенностей интерпретатора и мало связаны с самим языком, однако все эти нюансы интерпретатора постепенно становятся частью самого языка, и поэтому они так важны.

Я хочу начать наш разговор с одной странности интерпретатора (слоты) и закончить его самой большой ошибкой архитектуры языка. По сути, эта серия постов является исследованием решений, заложенных в архитектуре интерпретатора, и их влияния как на интерпретатор, так и на сам язык. Я считаю, что с точки зрения общего дизайна языка такие статьи будут выглядеть гораздо интереснее, чем просто высказывание мыслей по улучшению Python.
Читать дальше →

Мега-Учебник Flask, Часть 12: Реконструкция

Время на прочтение4 мин
Количество просмотров23K
Это двенадцатая статья в серии, где я описываю свой опыт написания веб-приложения на Python с использованием микрофреймворка Flask.

Цель данного руководства — разработать довольно функциональное приложение-микроблог, которое я за полным отсутствием оригинальности решил назвать microblog.



Краткое повторение



Если вы играли с нашим микроблогом, то вы заметили что он выглядит не лучшим образом. До сих пор мы использовали базовые шаблоны, без какой-либо стилизации. Это было полезно, потому что мы не хотели отвлекаться от написания кода, чтобы делать красивый HTML.

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

Ближайшие события

Мега-Учебник Flask, Часть 11: Поддержка e-mail

Время на прочтение8 мин
Количество просмотров26K
Это одиннадцатая статья в серии, где я описываю свой опыт написания веб-приложения на Python с использованием микрофреймворка Flask.

Цель данного руководства — разработать довольно функциональное приложение-микроблог, которое я за полным отсутствием оригинальности решил назвать microblog.


Краткое повторение


В последних уроках мы занимались, в основном, улучшениями связанными с нашей базой данных.

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

Мега-Учебник Flask, Часть 10: Полнотекстовый поиск

Время на прочтение7 мин
Количество просмотров20K
Это десятая статья в серии, где я описываю свой опыт написания веб-приложения на Python с использованием микрофреймворка Flask.

Цель данного руководства — разработать довольно функциональное приложение-микроблог, которое я за полным отсутствием оригинальности решил назвать microblog.



Краткое повторение


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

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

Окружение для разработки на aiorest (asyncio) + angular.js

Время на прочтение4 мин
Количество просмотров6.3K
В этой статье мы соберём вместе aiorest + jinja2 + angular.js + gulp.js + bower.js + nginx. В результате мы получим:
  • авто-перезапуск сервера при изменении python-кода и jinja-шаблонов
  • сборка, минификация и автоматическая пересборка при изменении клиентского js-кода
Начнём с главного — как пользоваться, а затем я подробнее опишу некоторые моменты реализации. Если вам легче читать код — вот ссылка на репу.

Читать дальше →

Push-уведомления в REST API на примере системы Таргет Mail.Ru

Время на прочтение5 мин
Количество просмотров28K


«Ну а здесь, знаешь ли, приходится бежать со всех ног, чтобы только остаться на том же месте, а чтобы попасть в другое место, нужно бежать вдвое быстрее»
Льюис Кэрролл, «Алиса в Зазеркалье»

Недавно мы в Таргете Mail.Ru реализовали систему push-уведомлений. Грамотное использование очередей задач позволяет реализовать быструю систему доставки уведомлений. В этом посте я расскажу о применении и реализации этой модели в нашем сервисе.
Читать дальше →

Item-based коллаборативная фильтрация своими руками

Время на прочтение10 мин
Количество просмотров20K
Робот-рекомендатель

Одной из наиболее популярных техник для построения персонализированных рекомендательных систем (RS, чтобы не путать с ПиСи) является коллаборативная фильтрация. Коллаборативная фильтрация бывает двух типов: user-based и item-based. User-based часто используется в качестве примера построения персонализированных RS [на хабре, в книге Т.Сегаран,...]. Тем не менее, у user-based подхода есть существенный недостаток: с увеличением количества пользователей RS линейно увеличивается сложность вычисления персонализированной рекомендации.

Когда количество объектов для рекомендаций большое, затраты на user-based подход могут быть оправданы. Однако во многих сервисах, в том числе и в ivi.ru, количество объектов в разы меньше количества пользователей. Для таких случаев и придуман item-based подход.

В этой статье я расскажу, как за несколько минут можно создать полноценную персонализированную RS на основе item-based подхода.
Читать дальше

Выразительная простота python на примере задач из комбинаторики

Время на прочтение2 мин
Количество просмотров25K
В процессе самообучения языку программирования python(имея знания с/с++) решил написать в качестве задания функции генерирующие элементы из различных множеств комбинаторных конфигураций. Конечно, можно справедливо заметить, что подобный функционал уже есть в стандартной библиотеке python в модуле itertools, но у каждого должно быть право изобрести велосипед, тем более в целях обучения…
Тот кто знаком с основами теории вероятностей должны помнить, что такое урновые схемы и о чем эта таблица:


И так ТЗ — написать четыре генератора, которые принимая строку s, состоящую из уникальных символов, и размер выборки к, возвращают строку — выборку с повторением/без повторений из k символов строки s порядок важен/не важен.
В результате получился следующий код:

import itertools
from functools import partial

import unittest

def template(s, k, assertion, reducer):
    n = len(s)
    assert assertion(n, k)
    
    if k == 0:
        yield ""
    elif k == 1:
        for c in s:
            yield c
    else:
        k-=1
        for i, c in enumerate(s):
            new_s = reducer(s, i)
            if not assertion(len(new_s), k):
                break
            for res in template(new_s, k, assertion, reducer):
                yield c+res
            
assertion_norep = lambda n, k: n > 0 and n >= k and k >= 0
assertion_rep   = lambda n, k: n > 0 and k >= 0

permutation_norep = partial(template, assertion=assertion_norep, reducer=lambda s, i: s[:i]+s[i+1:])
permutation_rep = partial(template, assertion=assertion_rep, reducer=lambda s, i: s)
combination_norep = partial(template, assertion=assertion_norep, reducer=lambda s, i: s[i+1:])
combination_rep = partial(template, assertion=assertion_rep, reducer=lambda s, i: s[i:])


class TestCombinatoricGenerators(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.test_string = "abcdefg"
        cls.k = 5

    def test_permutation_norep(self):
        self.assertEquals(set(permutation_norep(self.test_string, self.k)),
                          set(map(''.join, itertools.permutations(self.test_string, self.k))))

    def test_permutation_rep(self):
        self.assertEquals(set(permutation_rep(self.test_string, self.k)),
                          set(map(''.join, itertools.product(self.test_string, repeat=self.k))))

    def test_combination_norep(self):
        self.assertEquals(set(combination_norep(self.test_string, self.k)),
                          set(map(''.join, itertools.combinations(self.test_string, self.k))))

    def test_combination_rep(self):
        self.assertEquals(set(combination_rep(self.test_string, self.k)),
                          set(map(''.join, itertools.combinations_with_replacement(self.test_string, self.k))))

if __name__ == '__main__':
    unittest.main()


Так как python является языком еще более высокого уровня абстракции, чем с/с++, поэтому он позволяет проще и выразительнее писать код, который бы на других языках выглядел бы более громоздко и запутаннее. Новичкам в python я хотел бы обратить внимание на несколько моментов:

  • return после yield
  • Рекурсивный генератор
  • Шаблон стратегия
  • Использование lambda функций


P.S.
Могу добавить, что я не сразу пришел к подобному решению, использующему общую «шаблонную» функцию. Сначала я написал все функции по отдельности, а потом выделил общее и различное.

Удаленное управление VLC player’ом при помощи Arduino и Python

Время на прочтение4 мин
Количество просмотров15K
Добрый день, уважаемые читатели.

Я давно интересовался Arduino, и вот однажды решился на покупку этой замечательной платформы. После недолгих поисков приобрел небольшой Arduino kit, в котором, помимо прочего, был ИК-датчик и пульт к нему. Изучив примеры из мануала, понял, что настало время придумать что-то свое. В итоге я решил сделать удаленное управление VLC player’ом, используя магию Arduino и Python3.
Читать дальше →

Вклад авторов