Распространено мнение, что навык пакетирования своих наработок необходим только гуру в Open Source. Стас развенчал этот миф и показал несколько практических задач, решаемых при помощи пакетирования кода.
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
Python AST: между исходным текстом и байт-кодом / Николай Карелин / Системный архитектор VPI Development Center
Николай познакомит слушателей с деталями устройства Python AST и, в частности, расскажет некоторые интересные факты о работе диалекта Hy.
Python Meetup - встречи минского сообщества любителей языка программирования Python.
Присоединяйся к нам!
Мы в twitter: https://twitter.com/pythonminsk
Мы на youtube: http://www.youtube.com/pythonMinsk
Мы на slideshare: http://www.slideshare.net/MinskPythonMeetup
Артем Первухин "Язык программирования GO"
В докладе будет рассказано, чем сможет заинтересовать Python-разработчика язык программирования Go. Будут описаны базовые идиомы языка Go и даны ответы на следующие вопросы: Насколько применим к Go "Zen of Python"? Какая у этого языка область применения? В чём можно выиграть, использовав Go вместо Python?
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"PyNSK
Докладчик:
Александр Маршалов (ЦФТ)
Описание: Мы узнаем, что из себя представляет дерево синтаксического разбора (AST / Abstract Syntax Tree) в языке Python
и какие магические возможности можно получить с помощью модификации AST.
Распространено мнение, что навык пакетирования своих наработок необходим только гуру в Open Source. Стас развенчал этот миф и показал несколько практических задач, решаемых при помощи пакетирования кода.
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
Python AST: между исходным текстом и байт-кодом / Николай Карелин / Системный архитектор VPI Development Center
Николай познакомит слушателей с деталями устройства Python AST и, в частности, расскажет некоторые интересные факты о работе диалекта Hy.
Python Meetup - встречи минского сообщества любителей языка программирования Python.
Присоединяйся к нам!
Мы в twitter: https://twitter.com/pythonminsk
Мы на youtube: http://www.youtube.com/pythonMinsk
Мы на slideshare: http://www.slideshare.net/MinskPythonMeetup
Артем Первухин "Язык программирования GO"
В докладе будет рассказано, чем сможет заинтересовать Python-разработчика язык программирования Go. Будут описаны базовые идиомы языка Go и даны ответы на следующие вопросы: Насколько применим к Go "Zen of Python"? Какая у этого языка область применения? В чём можно выиграть, использовав Go вместо Python?
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"PyNSK
Докладчик:
Александр Маршалов (ЦФТ)
Описание: Мы узнаем, что из себя представляет дерево синтаксического разбора (AST / Abstract Syntax Tree) в языке Python
и какие магические возможности можно получить с помощью модификации AST.
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
"SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек", Алексей Черкес
Кратко рассказано о том, что такое биндинг и Pуthon c API. Краткий обзор средств биндинга для Python. SWIG: что такое, зачем нужен, особенности, схема работы утилит, порядок запуска и сборки, принципы работы, как происходит сопоставление объектных моделей С++ и целевого языка. Примеры на Python и C#. Опыт применения, плюсы/минусы.
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Stas Vyschepan
Вы разрабатываете веб-приложения и используете хранимые процедуры? Вы пишите SELECT … WITH(NOLOCK)? Вы считаете, что ORMы снижают быстродействие приложений? Тогда этот доклад для вас!
В докладе будут развенчаны популярные мифы о применении библиотек Object-Relational Mapping (ORM) в ASP.NET при работе с Microsoft SQL Server. Также будут рассмотрены конкретные методики увеличения быстродействия работы с данными в веб-приложениях.
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
2 июля 2011, Я.Субботник в Екатеринбурге
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
О докладе:
Про Python и Django: зачем нужна красота и простота перфекционистам с дедлайнами, на примере Яндекс.Погоды.
Когда число сервисов, которые делаются в Яндексе, стало возрастать, дедлайны — поджимать, а от процесса разработки требовалось стать более гибким, возникла потребность в свежих решениях. В докладе на примере Яндекс.Погоды рассказывается, как в Яндексе делают сервисы с помощью языка Python и веб-фреймворка Django.
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
В докладе мы рассмотрим создание переносимого дистрибутива Python для любых нужд и операционных систем (Windows & Linux). Познакомимся с существующими и альтернативными решениями. Сравним их достоинства и недостатки.
Докладчик: Григорий Кареев (Odin)
Видео: https://www.youtube.com/watch?v=fvBJG_IKvaQ
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/LinuxDefconRussia
Руткиты в мире основанных на ядре Linux операционных систем уже не являются редкостью. Рассказ будет о том, как попытки в современных реалиях определить то, скомпрометирована ли система, привели к неожиданному результату.
Python&Printer / Андрей Пучко / penta.byPython Meetup
Андрей рассказал о личном опыте сражений за печать отчетов из программ на Python. Речь шла о полезных инструментах и форматах документов (PDF, RTF, DOCX, XLS, ODT, HTML) которые можно готовить к печати при помощи Python.
Видео доклада: https://www.youtube.com/watch?v=slnQBoxsHPU
Rust - системный язык программирования, который быстро исполняется, предотвращает почти все падения, и устраняет гонки по данным.
Как он этого достигает? Про это доклад.
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Ontico
* Yasen (Yet Another Search Engine) – первоначальная архитектура поискового движка.
* Немного о старой схеме деплоя и её боли – buildbot, chef, git, monit, haproxy.
* Docker – простота и мощь в одной команде.
* Настраиваем запуск демона – что нужно знать.
* Dockerfile – проблемы и решения.
* Swarm, Kubernetes, Rancher – обзор вариантов оркестрации.
* Простой путь – docker-compose, и как его готовить.
* Разбираемся с сетью – bridge, host, overlay, macvlan, none.
* Root или не root в контейнере? Выбираем подходящее решение.
* Shared volumes и проблема права доступа к файлам.
* User namespaces – как и зачем?
* Docker и linux capabilities – добавляем безопасности.
* Нюансы ограничения ресурсов контейнеру: memory, cpu, swap.
* Stateful & Stateless в docker
* Автоматизация деплоя через docker-compose.
* Итоговая архитектура и процесс выкатки в production.
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Ontico
В эпоху распределённых архитектур и микросервисов как никогда актуальными становятся вопросы — как эффективно сериализовать и передать данные. Большинство решает данный вопрос просто — используют стандартный, универсальный и всем понятный формат JSON. Другие же, ориентируясь на производительность, ищут в интернете бенчмарки и выбирают protobuf или msgpack.
Мы протестировали разные реализации статически (thrift, protocol buffers) и динамически (json, msgpack) типизированных протоколов для python; сравнили их производительность в разных сценариях, возможности, внутреннее устройство, удобство разработки.
Я расскажу о результатах нашего исследования, особенностях "приготовления" библиотек и выявленных подводных камнях.
Документация на тему архитектуры языка PHP скудна и разрозненна, несмотря на то что тема интересна многим. В моем докладе я постараюсь заполнить этот пробел и рассказать о модулях PHP: как они работают, зачем и как их пишут. В процессе мы рассмотрим опыт Badoo в этой сфере на примерах двух модулей. И еще напишем очень небольшой собственный модуль.
— Что такое модули PHP, как они работают
— Как начать писать свой модуль PHP
— Скелет модуля — Функции, классы, методы
— Разбор параметров функции
— Сборка модуля
— Подгрузка модуля
— Простой пример модуля из Badoo
— Сложный пример модуля из Badoo
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
"SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек", Алексей Черкес
Кратко рассказано о том, что такое биндинг и Pуthon c API. Краткий обзор средств биндинга для Python. SWIG: что такое, зачем нужен, особенности, схема работы утилит, порядок запуска и сборки, принципы работы, как происходит сопоставление объектных моделей С++ и целевого языка. Примеры на Python и C#. Опыт применения, плюсы/минусы.
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Stas Vyschepan
Вы разрабатываете веб-приложения и используете хранимые процедуры? Вы пишите SELECT … WITH(NOLOCK)? Вы считаете, что ORMы снижают быстродействие приложений? Тогда этот доклад для вас!
В докладе будут развенчаны популярные мифы о применении библиотек Object-Relational Mapping (ORM) в ASP.NET при работе с Microsoft SQL Server. Также будут рассмотрены конкретные методики увеличения быстродействия работы с данными в веб-приложениях.
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
2 июля 2011, Я.Субботник в Екатеринбурге
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
О докладе:
Про Python и Django: зачем нужна красота и простота перфекционистам с дедлайнами, на примере Яндекс.Погоды.
Когда число сервисов, которые делаются в Яндексе, стало возрастать, дедлайны — поджимать, а от процесса разработки требовалось стать более гибким, возникла потребность в свежих решениях. В докладе на примере Яндекс.Погоды рассказывается, как в Яндексе делают сервисы с помощью языка Python и веб-фреймворка Django.
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.
В докладе мы рассмотрим создание переносимого дистрибутива Python для любых нужд и операционных систем (Windows & Linux). Познакомимся с существующими и альтернативными решениями. Сравним их достоинства и недостатки.
Докладчик: Григорий Кареев (Odin)
Видео: https://www.youtube.com/watch?v=fvBJG_IKvaQ
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/LinuxDefconRussia
Руткиты в мире основанных на ядре Linux операционных систем уже не являются редкостью. Рассказ будет о том, как попытки в современных реалиях определить то, скомпрометирована ли система, привели к неожиданному результату.
Python&Printer / Андрей Пучко / penta.byPython Meetup
Андрей рассказал о личном опыте сражений за печать отчетов из программ на Python. Речь шла о полезных инструментах и форматах документов (PDF, RTF, DOCX, XLS, ODT, HTML) которые можно готовить к печати при помощи Python.
Видео доклада: https://www.youtube.com/watch?v=slnQBoxsHPU
Rust - системный язык программирования, который быстро исполняется, предотвращает почти все падения, и устраняет гонки по данным.
Как он этого достигает? Про это доклад.
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Ontico
* Yasen (Yet Another Search Engine) – первоначальная архитектура поискового движка.
* Немного о старой схеме деплоя и её боли – buildbot, chef, git, monit, haproxy.
* Docker – простота и мощь в одной команде.
* Настраиваем запуск демона – что нужно знать.
* Dockerfile – проблемы и решения.
* Swarm, Kubernetes, Rancher – обзор вариантов оркестрации.
* Простой путь – docker-compose, и как его готовить.
* Разбираемся с сетью – bridge, host, overlay, macvlan, none.
* Root или не root в контейнере? Выбираем подходящее решение.
* Shared volumes и проблема права доступа к файлам.
* User namespaces – как и зачем?
* Docker и linux capabilities – добавляем безопасности.
* Нюансы ограничения ресурсов контейнеру: memory, cpu, swap.
* Stateful & Stateless в docker
* Автоматизация деплоя через docker-compose.
* Итоговая архитектура и процесс выкатки в production.
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Ontico
В эпоху распределённых архитектур и микросервисов как никогда актуальными становятся вопросы — как эффективно сериализовать и передать данные. Большинство решает данный вопрос просто — используют стандартный, универсальный и всем понятный формат JSON. Другие же, ориентируясь на производительность, ищут в интернете бенчмарки и выбирают protobuf или msgpack.
Мы протестировали разные реализации статически (thrift, protocol buffers) и динамически (json, msgpack) типизированных протоколов для python; сравнили их производительность в разных сценариях, возможности, внутреннее устройство, удобство разработки.
Я расскажу о результатах нашего исследования, особенностях "приготовления" библиотек и выявленных подводных камнях.
Документация на тему архитектуры языка PHP скудна и разрозненна, несмотря на то что тема интересна многим. В моем докладе я постараюсь заполнить этот пробел и рассказать о модулях PHP: как они работают, зачем и как их пишут. В процессе мы рассмотрим опыт Badoo в этой сфере на примерах двух модулей. И еще напишем очень небольшой собственный модуль.
— Что такое модули PHP, как они работают
— Как начать писать свой модуль PHP
— Скелет модуля — Функции, классы, методы
— Разбор параметров функции
— Сборка модуля
— Подгрузка модуля
— Простой пример модуля из Badoo
— Сложный пример модуля из Badoo
Очередной скучный доклад про логгированиеPython Meetup
Стас Рудаков, компания СООО "Гейм Стрим"/Wargaming.net
Значение логов очень часто недооценивается, а зря. Доклад с оживленным диспутом со всеми участниками митапа, чтобы разобраться: как, куда и зачем писать логи. Помимо этого затронут вопрос, как из логов выжать больше информации.
Fastvisuals - первый презентационный коучинг 1000 идей на 10 слайдахFastvisuals
Первый в России презентационный коучинг. За 2 дня вы сделаете продающую презентацию своего бизнеса на принципиально новом уровне... сами! В основе коучинга многолетние практики рекламных агентств создателей
Профессиональная 2-х дневная программа пошагового создания выдающихся презентаций своими руками. Ваших презентаций - вашими же руками. Это программа от практиков рекламы для практиков продаж
Domain-тестирование – формальное название методики тестирования, за которым скрывается банальная работа с классами эквивалентности. Впрочем, не такая уж и банальная. Даже в популярной литературе по тестированию часто упоминают только о существовании классов эквивалентности и о том, что с их граничными значениями работать очень полезно.
Мы знакомимся с основами этой методики, когда делаем первые шаги в тестировании, и больше никогда о ней не задумываемся, наивно считая, что она попала в нашу зону неосознанной компетентности и мы всегда используем ее правильно. А так ли это?
An impactful approach to the Seven Deadly Sins you and your Brand should avoid on Social Media! From a humoristic approach to a modern-life analogy for Social Media and including everything in between, this deck is a compelling resource that will provide you with more than a few take-aways for your Brand!
How People Really Hold and Touch (their Phones)Steven Hoober
For the newest version of this presentation, always go to: 4ourth.com/tppt
For the latest video version, see: 4ourth.com/tvid
Presented at ConveyUX in Seattle, 7 Feb 2014
For the newest version of this presentation, always go to: 4ourth.com/tppt
For the latest video version, see: 4ourth.com/tvid
We are finally starting to think about how touchscreen devices really work, and design proper sized targets, think about touch as different from mouse selection, and to create common gesture libraries.
But despite this we still forget the user. Fingers and thumbs take up space, and cover the screen. Corners of screens have different accuracy than the center. It's time to re-evaluate what we think we know.
Steven reviews his ongoing research into how people actually interact with mobile devices, presents some new ideas on how we can design to avoid errors and take advantage of this new knowledge, and leaves you with 10 (relatively) simple steps to improve your touchscreen designs tomorrow.
Why should we know about Spring internals? It works! So use it and enjoy! However, as always, in order to use Spring in most efficient way, you must know, what is under the fork. Only in case you really understand its internals you will be able to use all power of Spring. You will be able to customize this framework according to challenges of your project, to achieve best performance and solve any problem without applying to Spring-support center. ;) Here are several topics about Spring internals, which will be covered during this session (with examples for each one): What is Spring impact on the performance of your application? What are the phases of Spring lifecycle? What is ApplicationContext structure? “You can’t do it with Spring!” – or maybe you can?
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
Доклад для Middle и Senior .NET-программистов о микроптимизациях приложения, из которого Вы узнаете:
О том, как важно понимать IL и ASM код, соответствующий вашей C#-программе;
О различных уровнях микрооптимизаций начиная от C# и JIT компиляторов, заканчивая CPU;
Об особенностях оптимизаций под различные процессорные архитектуры;
Об отличиях разных версиях JIT-компиляторов, включая RyuJIT;
О том, как правильно замерять время выполнения приложений и оценивать эффективность оптимизаций.
Доклад будет полезен всем разработчикам, которые хотят хотят сделать свои и без того быстрые программы ещё на 5-10% быстрее.
Иван Кочуркин. Теория и практика парсинга формальных языковMskDotNet Community
В докладе рассказывается об инструментах и практиках парсинга формальных языков: как исходного кода, так и собственных предметно-ориентированных (DSL). О том, какие бывают парсеры и проблемы при их использовании. Доклад повествует как о базовых вещах: о токенах, деревьях разбора, абстрактных синтаксических деревьях (AST), так и о продвинутых: о методах обработки препроцессорных директив и восстановления от ошибок, о парсинге островных, нечувствительных к регистру языков и фрагментов кода. Помимо парсинга в докладе затрагивается тема обработки древовидных структур. Материал доклада основан на практических задачах и акцентирован на технологиях ANTLR и Roslyn.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
У компилятора и сторонних инструментов статического анализа кода есть общая задача - выявление опасных фрагментов кода. Однако существует существенная разница в том, анализ какого типа они осуществляют. Я попробую на примере компилятора Intel C++ и анализатора PVS-Studio продемонстрировать различия подходов, и пояснить, чем они вызваны.
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Python Meetup
Machine learning with Python / Олег Шидловский / Web developer Doist
Олег расскажет о базовых концепциях Machine learning и покажет примеры работы с библиотеками, при помощи которых можно легко решать задачи, связанные с машинным обучением.
Python Meetup - встречи минского сообщества любителей языка программирования Python.
Присоединяйся к нам!
Мы в twitter: https://twitter.com/pythonminsk
Мы на youtube: http://www.youtube.com/pythonMinsk
Мы на slideshare: http://www.slideshare.net/MinskPythonMeetup
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Python Meetup
Как скачать статистику игроков World of Tanks за одну ночь / Павел Пересторонин
Как при помощи Requests, Asyncio и Aiohttp перестать использовать многопоточный код? На примере Wargaming Public API Павел покажет, как однопоточный асинхронный код может оказаться эффективнее в исполнении и проще в отладке, чем наивный многопоточный.
Python Meetup - встречи минского сообщества любителей языка программирования Python.
Присоединяйся к нам!
Мы в twitter: https://twitter.com/pythonminsk
Мы на youtube: http://www.youtube.com/pythonMinsk
Мы на slideshare: http://www.slideshare.net/MinskPythonMeetup
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Python Meetup
Со временем для разработчика становится недостаточно одних технических скиллов. Павел в своей презентации поделится болью, негативным опытом и полезными советами как избежать его же ошибок.
Про асинхронность / Максим Щепелин / Web Developer WargamingPython Meetup
Речь пойдет о двух языках: Python и Javascript. Максим расскажет об асинхронной работе Python и Javascript, что даст возможность слушателям приобщиться к особой касте разработчиков, работающих с Twisted.
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014Python Meetup
Ежедневно разработчикам приходится писать десятки классов для разного рода функционала. Этот функционал может быть связан между собой или иметь разные функции. Нередко, сопровождая чужой код, программист, который более или менее понимает как должен реализовываться класс, видит картину, где, к примеру, класс «Товар» изменяет баланс клиента. По сути это в корне неверно!
Доклад будет рассматривать такую проблему как правильного написания классов. Данные 5 принципов можно применять к любому объектно-ориентированному языку, но в рамках Python meetup примеры будут продемонстрированы на python.
Данный доклад рассматривает 5 основных принципов, где каждая буква в аббревиатуре обозначает свой принцип.
S – Single responsibility principle (Принцип единой обязанности):
O – Open/Closed principle (Принцип Открытости/Закрытости)
L – Liskov substitution principle (Принцип постановки Барбары Лисков)
I – Interface segregation principle (Принцип разделения интерфейса)
D – Dependency inversion principle (Принцип инверсий зависимостей)
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Максим Барышников "Wargaming: тыл - фронту!"
Чтобы игра стала успешной (а из успешной превратилась в легендарную), недостаточно самой игры, сколь бы хороша она ни была. Помимо всего прочего, действительно массовой игре нужна очень развитая веб-часть. О ней и пойдет речь.
Redis – это инструмент, который должен быть в арсенале любого разработчика. В докладе Роман расскажет, как Redis помогает Todoist обслуживать сотни тысяч пользователей и подкупает простотой и изяществом своих решений.
Автор: Роман Иманкулов (компания Doist.io).
В докладе рассмотрим и выясним, что такое async envenloop, что из себя представялет Twisted, когда он может понадобиться и чего от него не стоит ожидать; концепция Deferred; взаимодействие с RDBMS и другими синхронными библиотеками; Application Framework; Twisted Web и т.п.
Автор: Андрей Жлобич (Wargaming.net)
Роман Иманкулов, компания Doist.io.
Доклад об анализе данных и посвящен преимущественно тем, кто хочет попробовать, но не знает с чего начать. О том, кому это вообще надо, где брать данные, какие инструменты есть в распоряжении начинающего python-аналитика и какую пользу для себя из всего можно извлечь на старте.
Найти видео презентации можно здесь: http://habrahabr.ru/company/wargaming/
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Python Meetup
Автор: Роман Иманкулов (doist.io)
Когда необходимо заставить веб-приложение выполнить тяжелую работу без ухудшения user experience, или нужно по-быстрому собрать кластер на коленке, возникает потребность в распределенном выполнении очередей команд. В докладе будут рассмотрены варианты организации таких очередей подручными средствами, будет выяснено, чем так хорош Celery, есть ли у него достойные альтернативы, и как написать рабочий менеджер очередей в тридцать строчек кода.
Использование gevent для эмуляции высокой нагрузкиPython Meetup
Автор: Александр Колесень (SiliconMint)
Обязательное действие перед выпуском более-менее серьёзного проекта — тестирование производительности. На высоконагруженных проектах нужно точно знать, какую нагрузку они могут выдержать, причём заранее. Следовательно, нужен способ эмуляции высокой конкурентности, желательно чтобы в теории он позволял полностью загрузить канал траффиком. К тому же, неплохо было бы, чтобы для этого не нужно было использовать несколько десятков серверов. В докладе будет рассказано об опыте использования gevent для подобной задачи, что позволило бы обойтись одним t1.micro инстансом, с которого выполняется тестирование.
Автор: Андрей Нехайчик (Wargaming.net | COOO «Гейм Стрим»)
— Треды, отличия от потоков.
— Как использовать треды.
— Тестирование производительности (и облом).
— Представление GIL, как он работает.
— Освобождение по I/O, 100 тиков.
— Зачем нужен GIL.
— Проблемы переключения потоков (медленный захват).
— Проблема 100 тиков.
— Проблема отсутствия приоритетов и их типов.
— Новый GIL, 5 миллисекунд, drop_request.
— Когда drop_request не работает.
— Соревнование CPU и I/O тредов.
— Как борются с GIL: тезисы о numpy, Jython, multiprocessing.
В докладе раскрыты слабые места Python, проблемы с GC, функциональным стилем, реализацией стандартных структур данных и интерпретатора CPython.
Автор: Кирилл Лашкевич
Социальный игровой сервер на Python: от первого коммита до продакшенаPython Meetup
Важными потребностями современного человека являются: общение с другими людьми и игры. На стыке двух этих потребностей и возникли различные игровые приложения в социальных сетях. Обычно такие приложения требуют наличия серверной стороны, способной справляться с высокими нагрузками. В данном докладе Алексей делится опытом разработки серверов на Python для социальных игр, начиная от этапа разработки дизайнерского документа и заканчивая выпуском игры в продакшн и её дальнейшей поддержкой.
Автор: Алексей Романов
Почему стоит все чаще задумывать о поддержке Python 3 и с какими проблемами можно столкнуться при портировании. Рассмотрим на примерах из Sentry (https://github.com/getsentry/sentry) как добавить поддержку Python 3 с использованием 2to3 (http://docs.python.org/3.3/library/2to3.html), tox (http://tox.readthedocs.org/en/latest/) и six (http://pythonhosted.org/six/).
Автор: Никита Гришко (Wargaming.net)
3. Вспомнить все
Наверняка не все присутствовали на первой части моего
выступления
“Внутренности” CPython, часть вторая 3
4. Вспомнить все
Наверняка не все присутствовали на первой части моего
выступления
Это ведь было аж в июне
“Внутренности” CPython, часть вторая 3
5. Вспомнить все
Наверняка не все присутствовали на первой части моего
выступления
Это ведь было аж в июне
Поэтому кратко повторю, о чем мы собираемся разговаривать
“Внутренности” CPython, часть вторая 3
8. CPython
Основная реализация на сегодняшний день
Написана на C
“Чистый” интерпретатор байткода, без JIT и AOT
“Внутренности” CPython, часть вторая 4
9. CPython
Основная реализация на сегодняшний день
Написана на C
“Чистый” интерпретатор байткода, без JIT и AOT
“Своя” VM, никаких отсылок к Java и .NET
“Внутренности” CPython, часть вторая 4
12. Альтернативы
native+ - PyPy
.NET - IronPython, Boo (правда, строго говоря это не Python)
JVM - Jython
“Внутренности” CPython, часть вторая 5
13. Альтернативы
native+ - PyPy
.NET - IronPython, Boo (правда, строго говоря это не Python)
JVM - Jython
Возможно другие. Они нас сегодня не интересуют.
“Внутренности” CPython, часть вторая 5
14. Альтернативы
native+ - PyPy
.NET - IronPython, Boo (правда, строго говоря это не Python)
JVM - Jython
Возможно другие. Они нас сегодня не интересуют.
Мы рассматриваем внутреннее устройство CPython.
“Внутренности” CPython, часть вторая 5
15. Все - объект
В CPython все является объектом
“Внутренности” CPython, часть вторая 6
16. Все - объект
В CPython все является объектом
Конкретнее - PyObject*
“Внутренности” CPython, часть вторая 6
17. Все - объект
В CPython все является объектом
Конкретнее - PyObject*
Числа, строки, код, фреймы, модули - абсолютно все
“Внутренности” CPython, часть вторая 6
18. Все - объект
В CPython все является объектом
Конкретнее - PyObject*
Числа, строки, код, фреймы, модули - абсолютно все
Любой PyObject начинается одинаково:
#define PyObject_HEAD
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
“Внутренности” CPython, часть вторая 6
19. PyObject
#define PyObject_HEAD
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
ob_refcnt - reference count для управления памятью
“Внутренности” CPython, часть вторая 7
20. PyObject
#define PyObject_HEAD
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
ob_refcnt - reference count для управления памятью
ob_type - type object, задающий поведение конкретного объекта
“Внутренности” CPython, часть вторая 7
21. PyObject
#define PyObject_HEAD
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
ob_refcnt - reference count для управления памятью
ob_type - type object, задающий поведение конкретного объекта
То, что дальше, может быть чем угодно.
“Внутренности” CPython, часть вторая 7
22. code object
Код в Python - тоже объект.
“Внутренности” CPython, часть вторая 8
23. code object
Код в Python - тоже объект.
Интерпретатор оперирует байткодом стековой машины.
“Внутренности” CPython, часть вторая 8
24. code object
Код в Python - тоже объект.
Интерпретатор оперирует байткодом стековой машины.
Инструкции занимают 1 байт, опционально принимают один
двухбайтный аргумент.
“Внутренности” CPython, часть вторая 8
25. code object
Код в Python - тоже объект.
Интерпретатор оперирует байткодом стековой машины.
Инструкции занимают 1 байт, опционально принимают один
двухбайтный аргумент.
Константы сложных типов хранятся “рядом” в code object,
обращение к ним происходит по индексу.
“Внутренности” CPython, часть вторая 8
28. Стековая машина
На уровне байткода CPython является стековой машиной.
“Внутренности” CPython, часть вторая 11
29. Стековая машина
На уровне байткода CPython является стековой машиной.
Значения кладутся на стек, операции берут их с вершины стека,
иногда меняя порядок верхних элементов.
“Внутренности” CPython, часть вторая 11
30. Стековая машина
На уровне байткода CPython является стековой машиной.
Значения кладутся на стек, операции берут их с вершины стека,
иногда меняя порядок верхних элементов.
Стек значений не имеет отношения к стеку адресов возврата - это
отдельная сущность.
“Внутренности” CPython, часть вторая 11
31. Стековая машина, пример
def f(a,b,c): return a + b*c
0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 LOAD_FAST 2 (c)
9 BINARY_MULTIPLY
10 BINARY_ADD
11 RETURN_VALUE
“Внутренности” CPython, часть вторая 12
32. Нелокальный выход
Стек значений (value stack) существует в рамках одного
исполнения code object
“Внутренности” CPython, часть вторая 13
33. Нелокальный выход
Стек значений (value stack) существует в рамках одного
исполнения code object
Python поддерживает нелокальный выход (break, continue,
raise)
“Внутренности” CPython, часть вторая 13
34. Нелокальный выход
Стек значений (value stack) существует в рамках одного
исполнения code object
Python поддерживает нелокальный выход (break, continue,
raise)
Необходимо “открутить” стек значений на момент входа в for,
while или локальный try
“Внутренности” CPython, часть вторая 13
35. Нелокальный выход
Стек значений (value stack) существует в рамках одного
исполнения code object
Python поддерживает нелокальный выход (break, continue,
raise)
Необходимо “открутить” стек значений на момент входа в for,
while или локальный try
С++ использует для stack unwind при исключениях пометки в
“общем” стеке
“Внутренности” CPython, часть вторая 13
36. Нелокальный выход
Стек значений (value stack) существует в рамках одного
исполнения code object
Python поддерживает нелокальный выход (break, continue,
raise)
Необходимо “открутить” стек значений на момент входа в for,
while или локальный try
С++ использует для stack unwind при исключениях пометки в
“общем” стеке
CPython использует для этих целей block stack.
“Внутренности” CPython, часть вторая 13
37. Block stack
Block stack хранит в себе пары вида (адрес, глубина стека)
“Внутренности” CPython, часть вторая 14
38. Block stack
Block stack хранит в себе пары вида (адрес, глубина стека)
Инструкции вроде break “откручивают” value stack до
запомненного значения глубины и делают goto на указанный
адрес в байткоде
“Внутренности” CPython, часть вторая 14
39. Block stack
Block stack хранит в себе пары вида (адрес, глубина стека)
Инструкции вроде break “откручивают” value stack до
запомненного значения глубины и делают goto на указанный
адрес в байткоде
Давайте посмотрим как это выглядит
“Внутренности” CPython, часть вторая 14
42. ceval.c, BREAK
case BREAK_LOOP:
why = WHY_BREAK;
goto fast_block_end;
fast_block_end:
while (why != WHY_NOT && f->f_iblock > 0) {
PyTryBlock *b = PyFrame_BlockPop(f);
if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
why = WHY_NOT;
JUMPTO(b->b_handler);
break; }
“Внутренности” CPython, часть вторая 17
43. Другие хранилища
Помимо value stack и block stack, нужно еще хранить адреса
возврата, локальные переменные, лексическое замыкание
“Внутренности” CPython, часть вторая 18
44. Другие хранилища
Помимо value stack и block stack, нужно еще хранить адреса
возврата, локальные переменные, лексическое замыкание
В прошлой части этой презентации рассказывалось, что
локальные переменные определяются на этапе компиляции и для
них заводится список фиксированного размера с обращением по
индексу за O(1)
“Внутренности” CPython, часть вторая 18
45. Другие хранилища
Помимо value stack и block stack, нужно еще хранить адреса
возврата, локальные переменные, лексическое замыкание
В прошлой части этой презентации рассказывалось, что
локальные переменные определяются на этапе компиляции и для
них заводится список фиксированного размера с обращением по
индексу за O(1)
Аналогично компилятор (в байткод) поступает и с лексическим
замыканием
“Внутренности” CPython, часть вторая 18
46. Другие хранилища
Помимо value stack и block stack, нужно еще хранить адреса
возврата, локальные переменные, лексическое замыкание
В прошлой части этой презентации рассказывалось, что
локальные переменные определяются на этапе компиляции и для
них заводится список фиксированного размера с обращением по
индексу за O(1)
Аналогично компилятор (в байткод) поступает и с лексическим
замыканием
Кроме того, code object может вызвать сам себя (рекурсия?) и
тогда обоим экземплярам нужны свои стеки.
“Внутренности” CPython, часть вторая 18
48. frame object
Является хранилищем состояния для конкретного code object
Без code object не имеет смысла - все его параметры
определяются атрибутами исполняемого кода
“Внутренности” CPython, часть вторая 19
49. frame object
Является хранилищем состояния для конкретного code object
Без code object не имеет смысла - все его параметры
определяются атрибутами исполняемого кода
Включает в себя value stack, block stack, locals, cellvars
“Внутренности” CPython, часть вторая 19
50. frame object
Является хранилищем состояния для конкретного code object
Без code object не имеет смысла - все его параметры
определяются атрибутами исполняемого кода
Включает в себя value stack, block stack, locals, cellvars
Ссылается на предыдущий фрейм в стеке
“Внутренности” CPython, часть вторая 19
51. frame object
frame object - полный аналог activation frame в С
“Внутренности” CPython, часть вторая 20
52. frame object
frame object - полный аналог activation frame в С
Только в C activation frame расположен на общем стеке - адреса
возврата и локальные переменные идут “вперемешку”, и activation
frame волей-неволей уничтожается при выходе из функции
(последующие вызовы других функций его перетрут).
“Внутренности” CPython, часть вторая 20
53. frame object
frame object - полный аналог activation frame в С
Только в C activation frame расположен на общем стеке - адреса
возврата и локальные переменные идут “вперемешку”, и activation
frame волей-неволей уничтожается при выходе из функции
(последующие вызовы других функций его перетрут).
В frame object есть ссылка f_back на предыдущий фрейм в стеке,
поэтому в CPython стек вызовов реализован как односвязный
список.
“Внутренности” CPython, часть вторая 20
54. Почему односвязный список?
В отличие от contiguous представления стека в C, это позволяет
продлевать время жизни фрейма сколь угодно долго.
“Внутренности” CPython, часть вторая 21
55. Почему односвязный список?
В отличие от contiguous представления стека в C, это позволяет
продлевать время жизни фрейма сколь угодно долго.
Каждый фрейм выделяется и освобождается как обычный
PyObject, в подходящем месте в памяти, совершенно
необязательно кого-то перетирать.
“Внутренности” CPython, часть вторая 21
56. Почему односвязный список?
В отличие от contiguous представления стека в C, это позволяет
продлевать время жизни фрейма сколь угодно долго.
Каждый фрейм выделяется и освобождается как обычный
PyObject, в подходящем месте в памяти, совершенно
необязательно кого-то перетирать.
Это позволяет реализовать генераторы.
“Внутренности” CPython, часть вторая 21
57. Генераторы
Это просто стек (в виде списка) фреймов, завернутый в объект
(genobject).
“Внутренности” CPython, часть вторая 22
58. Генераторы
Это просто стек (в виде списка) фреймов, завернутый в объект
(genobject).
yield приостанавливает его выполнение, next() возобновляет c
того места, где в последний раз был вызван yield
“Внутренности” CPython, часть вторая 22
59. Генераторы
Это просто стек (в виде списка) фреймов, завернутый в объект
(genobject).
yield приостанавливает его выполнение, next() возобновляет c
того места, где в последний раз был вызван yield
Стек фреймов живет столько, сколько живет genobject.
“Внутренности” CPython, часть вторая 22
62. Генераторы
Генераторы в CPython не столь общи, как хотелось бы
Во-первых, yield это statement, а не expression
“Внутренности” CPython, часть вторая 24
63. Генераторы
Генераторы в CPython не столь общи, как хотелось бы
Во-первых, yield это statement, а не expression
Во-вторых, yield возможен только в самой функции-генераторе,
нo не в вызываемых ею
“Внутренности” CPython, часть вторая 24
64. Генераторы
Генераторы в CPython не столь общи, как хотелось бы
Во-первых, yield это statement, а не expression
Во-вторых, yield возможен только в самой функции-генераторе,
нo не в вызываемых ею
Оба ограничения нефундаментальны
“Внутренности” CPython, часть вторая 24
65. Генераторы - альтернативы
PEP 380 - официально принятый для Python 3 пропоузал,
который позволит реализовывать полноценные сопрограммы на
генераторах (как, например, в Lua)
“Внутренности” CPython, часть вторая 25
66. Генераторы - альтернативы
PEP 380 - официально принятый для Python 3 пропоузал,
который позволит реализовывать полноценные сопрограммы на
генераторах (как, например, в Lua)
greenlet - нативный модуль расширения для CPython,
реализующий кооперативную многозадачность через “срезание”
сишного стека
“Внутренности” CPython, часть вторая 25
67. Генераторы - альтернативы
PEP 380 - официально принятый для Python 3 пропоузал,
который позволит реализовывать полноценные сопрограммы на
генераторах (как, например, в Lua)
greenlet - нативный модуль расширения для CPython,
реализующий кооперативную многозадачность через “срезание”
сишного стека
stackless - форк CPython, развивающий идею “фреймы как
объекты” до полноценной кооперативной многозадачности
“Внутренности” CPython, часть вторая 25
69. Объектная модель
Ранее мы уже упоминали, что все с точки зрения CPython есть
PyObject
“Внутренности” CPython, часть вторая 27
70. Объектная модель
Ранее мы уже упоминали, что все с точки зрения CPython есть
PyObject
Также мы знаем, что в байткоде инструкция BINARY_ADD удаляет
два объекта с вершины стека, складывает их, после чего
помещает результат на вершину стека
“Внутренности” CPython, часть вторая 27
71. Объектная модель
Ранее мы уже упоминали, что все с точки зрения CPython есть
PyObject
Также мы знаем, что в байткоде инструкция BINARY_ADD удаляет
два объекта с вершины стека, складывает их, после чего
помещает результат на вершину стека
Сложение для чисел - это сложение, для строк - конкатенация, и
вообще мы можем переопределить __add__ у чего угодно
“Внутренности” CPython, часть вторая 27
72. Объектная модель
Ранее мы уже упоминали, что все с точки зрения CPython есть
PyObject
Также мы знаем, что в байткоде инструкция BINARY_ADD удаляет
два объекта с вершины стека, складывает их, после чего
помещает результат на вершину стека
Сложение для чисел - это сложение, для строк - конкатенация, и
вообще мы можем переопределить __add__ у чего угодно
Как интерпретатор узнает, что делать?
“Внутренности” CPython, часть вторая 27
73. Type object, слоты, протоколы
В самом начале мы упомянули, что у PyObject обязательно
присутствует поле ob_type - ссылка на type object
“Внутренности” CPython, часть вторая 28
74. Type object, слоты, протоколы
В самом начале мы упомянули, что у PyObject обязательно
присутствует поле ob_type - ссылка на type object
Оказывается, в type object есть слоты, возвращающие реализации
требуемых операций (если те поддерживаются объектом, само
собой)
“Внутренности” CPython, часть вторая 28
75. Type object, слоты, протоколы
В самом начале мы упомянули, что у PyObject обязательно
присутствует поле ob_type - ссылка на type object
Оказывается, в type object есть слоты, возвращающие реализации
требуемых операций (если те поддерживаются объектом, само
собой)
Интерпретатор просто вызывает нужные функции по указателям,
либо возвращает ошибку несовместимости типов.
“Внутренности” CPython, часть вторая 28
76. Type object, слоты, протоколы
В самом начале мы упомянули, что у PyObject обязательно
присутствует поле ob_type - ссылка на type object
Оказывается, в type object есть слоты, возвращающие реализации
требуемых операций (если те поддерживаются объектом, само
собой)
Интерпретатор просто вызывает нужные функции по указателям,
либо возвращает ошибку несовместимости типов.
Рассмотрим на примере int object.
“Внутренности” CPython, часть вторая 28
77. ceval.c
case BINARY_ADD:
w = POP();
v = TOP();
....
else {
slow_add:
x = PyNumber_Add(v, w);
}
...
SET_TOP(x);
“Внутренности” CPython, часть вторая 29
79. abstract.c
static PyObject
*binary_op1(PyObject *v, PyObject *w, const int op_slot)
{
binaryfunc slotv = NULL;
...
slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
...
if (slotv) {
x = slotv(v, w);
if (x != Py_NotImplemented)
return x;
“Внутренности” CPython, часть вторая 31
80. intobject.c
static PyObject *
int_add(PyIntObject *v, PyIntObject *w)
{
register long a, b, x;
CONVERT_TO_LONG(v, a);
CONVERT_TO_LONG(w, b);
....
x = (long)((unsigned long)a + b);
if ((x^a) >= 0 || (x^b) >= 0)
return PyInt_FromLong(x);
....
“Внутренности” CPython, часть вторая 32
81. Слоты и протоколы
Слоты и протоколы - это довольно низкоуровневая особенность,
которая из кода на Python не видна
“Внутренности” CPython, часть вторая 33
82. Слоты и протоколы
Слоты и протоколы - это довольно низкоуровневая особенность,
которая из кода на Python не видна
Как она сочетается с наследованием и возможностью
переопределения через “магические” имена (вроде __add__?)
“Внутренности” CPython, часть вторая 33
83. Слоты и протоколы
Слоты и протоколы - это довольно низкоуровневая особенность,
которая из кода на Python не видна
Как она сочетается с наследованием и возможностью
переопределения через “магические” имена (вроде __add__?)
В этом проявляется красота объектной модели Python.
“Внутренности” CPython, часть вторая 33
84. type object == class
type object и классы - одно и то же.
“Внутренности” CPython, часть вторая 34
85. type object == class
type object и классы - одно и то же.
(За исключением old style classes, которые все являются
объектами типа instance и фактически существуют только ради
совместимости с legacy кодом на Python < 2.5)
“Внутренности” CPython, часть вторая 34
86. type object == class
type object и классы - одно и то же.
(За исключением old style classes, которые все являются
объектами типа instance и фактически существуют только ради
совместимости с legacy кодом на Python < 2.5)
При создании класса создается новый type object, который
наполняется содержимым из классов-родителей.
“Внутренности” CPython, часть вторая 34
87. type object == class
При наследовании классов все слоты type object копируются в
новый класс (typeobject.c):
static PyObject *
type_new(PyTypeObject *metatype,
PyObject *args, PyObject *kwds)
{
...
/* Put the proper slots in place */
fixup_slot_dispatchers(type);
“Внутренности” CPython, часть вторая 35
88. type object == class
При попытке переопределить метод в рантайме через выставление
“магического” атрибута класса в дело включается type_setattro,
определенный в слоте tp_setattro у типа класса
“Внутренности” CPython, часть вторая 36
89. type object == class
При попытке переопределить метод в рантайме через выставление
“магического” атрибута класса в дело включается type_setattro,
определенный в слоте tp_setattro у типа класса
Да, у type object тоже есть тип, и это тоже type object :)
“Внутренности” CPython, часть вторая 36
90. type object == class
При попытке переопределить метод в рантайме через выставление
“магического” атрибута класса в дело включается type_setattro,
определенный в слоте tp_setattro у типа класса
Да, у type object тоже есть тип, и это тоже type object :)
type_setattro знает про слоты и правильно их обновляет:
static int
type_setattro(PyTypeObject *type,
PyObject *name, PyObject *value)
{
...
return update_slot(type, name);
“Внутренности” CPython, часть вторая 36
91. type object == class
Кроме того, технические поля инстанса (вроде __dict__), также
являются с точки зрения типа обычными аттрибутами
“Внутренности” CPython, часть вторая 37
92. type object == class
Кроме того, технические поля инстанса (вроде __dict__), также
являются с точки зрения типа обычными аттрибутами
Вкупе с дескрипторами, про которые много кто уже здесь
говорил, это дает поистине впечатляющие возможности
“Внутренности” CPython, часть вторая 37
93. type object == class
Кроме того, технические поля инстанса (вроде __dict__), также
являются с точки зрения типа обычными аттрибутами
Вкупе с дескрипторами, про которые много кто уже здесь
говорил, это дает поистине впечатляющие возможности
В частности, практически ко всему, во что можно впихнуть
заголовок PyObject, можно предоставить идиоматичную
питоновскую обертку, не меняя представления
“Внутренности” CPython, часть вторая 37
94. type object == class
Кроме того, технические поля инстанса (вроде __dict__), также
являются с точки зрения типа обычными аттрибутами
Вкупе с дескрипторами, про которые много кто уже здесь
говорил, это дает поистине впечатляющие возможности
В частности, практически ко всему, во что можно впихнуть
заголовок PyObject, можно предоставить идиоматичную
питоновскую обертку, не меняя представления
Это обуславливает такое количество библиотек - делать
интерфейсы для C/C++ библиотек довольно легко
“Внутренности” CPython, часть вторая 37
95. slots
Чтобы поменять представление объекта в памяти, необязательно
лезть на уровень Python/C API
“Внутренности” CPython, часть вторая 38
96. slots
Чтобы поменять представление объекта в памяти, необязательно
лезть на уровень Python/C API
Для объектов, которые создаются миллионами и редко меняют
набор полей, есть встроенная возможность избежать создания
__dict__ для каждого инстанса.
“Внутренности” CPython, часть вторая 38
97. slots
Чтобы поменять представление объекта в памяти, необязательно
лезть на уровень Python/C API
Для объектов, которые создаются миллионами и редко меняют
набор полей, есть встроенная возможность избежать создания
__dict__ для каждого инстанса.
Для этого в классе надо объявить атрибут __slots__, и в нем
объявить имена полей.
“Внутренности” CPython, часть вторая 38
98. slots
Чтобы поменять представление объекта в памяти, необязательно
лезть на уровень Python/C API
Для объектов, которые создаются миллионами и редко меняют
набор полей, есть встроенная возможность избежать создания
__dict__ для каждого инстанса.
Для этого в классе надо объявить атрибут __slots__, и в нем
объявить имена полей.
Тогда все инстансы будут хранить только ссылки на значения
атрибутов в определенном порядке, __dict__ будет создан только
при попытке выставить атрибут не из __slots__.
“Внутренности” CPython, часть вторая 38
99. slots
>>> class SlotClass: __slots__ = "x", "y"
>>> X = SlotClass()
>>> X.x = 1; X.y = 2
>>> asizeof(X)
128
>>> class DictClass: pass
>>> Y = DictClass()
>>> Y.x = 1; Y.y = 2
>>> asizeof(Y)
480
“Внутренности” CPython, часть вторая 39
101. Заключение
Напоследок хочу напомнить, что все рассказанное может быть
почерпнуто прямо из исходников CPython - они хорошо
задокументированы и читаются довольно легко
“Внутренности” CPython, часть вторая 41
102. Заключение
Напоследок хочу напомнить, что все рассказанное может быть
почерпнуто прямо из исходников CPython - они хорошо
задокументированы и читаются довольно легко
Лезть в исходники интерпретатора чтобы понять, как ведет себя
прикладной код - вполне себе реальный сценарий
“Внутренности” CPython, часть вторая 41
103. Заключение
Напоследок хочу напомнить, что все рассказанное может быть
почерпнуто прямо из исходников CPython - они хорошо
задокументированы и читаются довольно легко
Лезть в исходники интерпретатора чтобы понять, как ведет себя
прикладной код - вполне себе реальный сценарий
Если тема доклада вас заинтересовала, то от себя хочу
порекомендовать следующие ресурсы
“Внутренности” CPython, часть вторая 41
104. “Python Innards”, Yaniv Aknin
http://en.wordpress.com/tag/pythons-innards/
Серия постов от Yaniv Aknin про байткод, стеки,
thread state и объектную модель в CPython.
“Внутренности” CPython, часть вторая 42
105. “Python internals”, Eli Bendersky
http://tinyurl.com/pyinternals
Серия постов от Eli Bendersky про компилятор
Python, а также объектную модель Python 3.
“Внутренности” CPython, часть вторая 43
106. “Understanding the Python GIL”, David Beazley
http://www.dabeaz.com/GIL/
Презентации David Beazley, касающиеся
особенностей реализации GIL в Python,
проливающие свет на его неочевидное поведение
(например, существенное замедление CPU-bound
многопоточного кода на многоядерных машинах)
“Внутренности” CPython, часть вторая 44