SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
Python imperfections
Cyril @notorca Lashkevich
Элементы функционального
стиля
Python не функциональный язык
Но иногда хочется…
… или случайно получается
Разминка
def empty(_): return None

def add(d, k, v):

def new_dict(x):

if x == k:

return v

else:

return d(x)

return new_dict

def add_f(d, k, v):

return lambda x: v if k == x else d(x)
Разминка
def empty(_): return None

>> d = add(empty, 1, "abc")
def add(d, k, v):

>> d = add_f(d, 2, "def")
def new_dict(x):

>> d(1)
if x == k:

'abc'
return v

>> d(2)
else:

'def'
return d(x)
 >> d(0)
>>
return new_dict


def add_f(d, k, v):

return lambda x: v if k == x else d(x)
Захват переменных в замыкания
def Counter(x):
a = x
def zero():
a = 0
def val():
return a
def inc():
a += 1
return a
return (zero,
val, inc)
Захват переменных в замыкания
def Counter(x): >> zero, val, inc = Counter(5)
a = x
>> zero()
def zero(): >> val()
a = 0
5
def val():
>> inc()
return a
def inc():
a += 1
return a
return (zero,
val, inc)
Захват переменных в замыкания
def Counter(x): >> zero, val, inc = Counter(5)
a = x
>> zero()
def zero(): >> val()
a = 0
5
def val():
>> inc()
return a
UnboundLocalError:

def inc():
a += 1
local variable 'a'

return a
referenced before

return (zero,
val, inc) assignment
3.x
def Counter(x):
a = x
def zero():
nonlocal a = 0
def val():
return a
def inc():
nonlocal a
a += 1
return a
return (zero,
val, inc)

2.x
def Counter(x):
a = [x]
def zero():
a[0] = 0
def val():
return a[0]
def inc():
a[0] += 1
return a[0]
return (zero,
val, inc)
Генераторы и yield
Возможность удобно использовать генераторы в
генераторах появилась только в 3.3, PEP 380
yield form
Даже с этим генераторы слабее более общей
концепции coroutines
yield не функция, а синтаксический элемент
привязанный к контексту, не first-class citizen
def accumulate():

res = 0

while 1:

n = yield

if n is None:

return res

res += n

def gather_sums(sums):

while 1:

s = yield from accumulate()

sums.append(s)
def accumulate():

res = 0

while 1:

n = yield

if n is None:

return res

res += n


>> sums = []
>> acc = gather_sums(sums)
>> next(acc)
>> for i in range(4):
..
acc.send(i)
..
>> acc.send(None)
>> for i in range(5):
..
acc.send(i)
..
>> acc.send(None)
>> sums
[6, 10]

def gather_sums(sums):

while 1:

s = yield from accumulate()

sums.append(s)
def inorder(t):

if t:

for x in inorder(t.left):

yield x

yield t.label

for x in inorder(t.right):

yield x

def inorder_33(t):

if t:

yield from inorder(t.left)

yield t.label

yield from inorder(t.right)
function inorder(f, t)

if t then

inorder(f, t.left)

f(t.label)

return inorder(f, t.right)

end

end

for label in coroutine.wrap(inorder),

coroutine.yield, t do

-- something with label

end

inorder(print, t)
Неоднородность Object Model
weakref
__slots__
__del__
new/old style objects
Bytecode
~110 инструкции байткода (39 в Lua)
PyObject *
PyEval_EvalFrameEx(PyFrameObject *f,

int throwflag) {
// ~2200 lines
}
void luaV_execute (lua_State *L) {
// 320 lines
}
API
Объемный и сложный в использовании
818 функции (3.3) vs 123 + 66 aux в Lua
Не все гладко с Py_Initialize/Py_Finalize
GIL
Глобальный для
процесса семафор/
conditional variable
Не дает нескольким
потокам выполнятся
одновременно…
…почти
Программа на С
создает потоки, в
каждом из которых
свой экземпляр
интерпретатора?
Программа на С
создает потоки, в
каждом из которых
свой экземпляр
интерпретатора?
GIL глобальный для
процесса
The End
Cyril @notorca Lashkevich

Weitere ähnliche Inhalte

Was ist angesagt?

Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?PyNSK
 
Python
PythonPython
Pythonpelid
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателейDEVTYPE
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Sergey Tihon
 
Why Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreWhy Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreAlexander Schepanovski
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow SeptemberAlexander Zimin
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Theoretical mechanics department
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11C++ осень 2012 лекция 11
C++ осень 2012 лекция 11Technopark
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 

Was ist angesagt? (20)

Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
Python
PythonPython
Python
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компилятор
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
Why Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreWhy Every Language Needs Its Underscore
Why Every Language Needs Its Underscore
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Cocoheads Moscow September
Cocoheads Moscow SeptemberCocoheads Moscow September
Cocoheads Moscow September
 
Funny JS #2
Funny JS #2Funny JS #2
Funny JS #2
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
C++ осень 2012 лекция 11
C++ осень 2012 лекция 11C++ осень 2012 лекция 11
C++ осень 2012 лекция 11
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 

Ähnlich wie Недостатки Python

Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...Mail.ru Group
 
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...Dmitri Soshnikov
 
Функциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевФункциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевAleksander Alekseev
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
лекция 3. программирование циклов
лекция 3. программирование цикловлекция 3. программирование циклов
лекция 3. программирование цикловstudent_kai
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 

Ähnlich wie Недостатки Python (20)

Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
 
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
SECR2013: F# и обработка потоковых данных: от потока твиттер-сообщений до сен...
 
Coroutines
CoroutinesCoroutines
Coroutines
 
Iteratee explained.
Iteratee explained.Iteratee explained.
Iteratee explained.
 
Функциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевФункциональное программирование - Александр Алексеев
Функциональное программирование - Александр Алексеев
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
лекция 3. программирование циклов
лекция 3. программирование цикловлекция 3. программирование циклов
лекция 3. программирование циклов
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Scala
ScalaScala
Scala
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
23
2323
23
 

Mehr von Python Meetup

Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Python Meetup
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Python Meetup
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python Meetup
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer WargamingPython Meetup
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Python Meetup
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...Python Meetup
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingPython Meetup
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014Python Meetup
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Python Meetup
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GOPython Meetup
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюPython Meetup
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка TwistedPython Meetup
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Python Meetup
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данныхPython Meetup
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Python Meetup
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиPython Meetup
 

Mehr von Python Meetup (20)

Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
 
Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer Wargaming
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностью
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне
 
Pebble
PebblePebble
Pebble
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данных
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузки
 

Недостатки Python

  • 2. Элементы функционального стиля Python не функциональный язык Но иногда хочется… … или случайно получается
  • 3. Разминка def empty(_): return None
 def add(d, k, v):
 def new_dict(x):
 if x == k:
 return v
 else:
 return d(x)
 return new_dict
 def add_f(d, k, v):
 return lambda x: v if k == x else d(x)
  • 4. Разминка def empty(_): return None
 >> d = add(empty, 1, "abc") def add(d, k, v):
 >> d = add_f(d, 2, "def") def new_dict(x):
 >> d(1) if x == k:
 'abc' return v
 >> d(2) else:
 'def' return d(x)
 >> d(0) >> return new_dict
 def add_f(d, k, v):
 return lambda x: v if k == x else d(x)
  • 5. Захват переменных в замыкания def Counter(x): a = x def zero(): a = 0 def val(): return a def inc(): a += 1 return a return (zero, val, inc)
  • 6. Захват переменных в замыкания def Counter(x): >> zero, val, inc = Counter(5) a = x >> zero() def zero(): >> val() a = 0 5 def val(): >> inc() return a def inc(): a += 1 return a return (zero, val, inc)
  • 7. Захват переменных в замыкания def Counter(x): >> zero, val, inc = Counter(5) a = x >> zero() def zero(): >> val() a = 0 5 def val(): >> inc() return a UnboundLocalError:
 def inc(): a += 1 local variable 'a'
 return a referenced before
 return (zero, val, inc) assignment
  • 8. 3.x def Counter(x): a = x def zero(): nonlocal a = 0 def val(): return a def inc(): nonlocal a a += 1 return a return (zero, val, inc) 2.x def Counter(x): a = [x] def zero(): a[0] = 0 def val(): return a[0] def inc(): a[0] += 1 return a[0] return (zero, val, inc)
  • 9. Генераторы и yield Возможность удобно использовать генераторы в генераторах появилась только в 3.3, PEP 380 yield form Даже с этим генераторы слабее более общей концепции coroutines yield не функция, а синтаксический элемент привязанный к контексту, не first-class citizen
  • 10. def accumulate():
 res = 0
 while 1:
 n = yield
 if n is None:
 return res
 res += n
 def gather_sums(sums):
 while 1:
 s = yield from accumulate()
 sums.append(s)
  • 11. def accumulate():
 res = 0
 while 1:
 n = yield
 if n is None:
 return res
 res += n
 >> sums = [] >> acc = gather_sums(sums) >> next(acc) >> for i in range(4): .. acc.send(i) .. >> acc.send(None) >> for i in range(5): .. acc.send(i) .. >> acc.send(None) >> sums [6, 10] def gather_sums(sums):
 while 1:
 s = yield from accumulate()
 sums.append(s)
  • 12. def inorder(t):
 if t:
 for x in inorder(t.left):
 yield x
 yield t.label
 for x in inorder(t.right):
 yield x
 def inorder_33(t):
 if t:
 yield from inorder(t.left)
 yield t.label
 yield from inorder(t.right)
  • 13. function inorder(f, t)
 if t then
 inorder(f, t.left)
 f(t.label)
 return inorder(f, t.right)
 end
 end
 for label in coroutine.wrap(inorder),
 coroutine.yield, t do
 -- something with label
 end
 inorder(print, t)
  • 15. Bytecode ~110 инструкции байткода (39 в Lua) PyObject * PyEval_EvalFrameEx(PyFrameObject *f,
 int throwflag) { // ~2200 lines } void luaV_execute (lua_State *L) { // 320 lines }
  • 16. API Объемный и сложный в использовании 818 функции (3.3) vs 123 + 66 aux в Lua Не все гладко с Py_Initialize/Py_Finalize
  • 17. GIL Глобальный для процесса семафор/ conditional variable Не дает нескольким потокам выполнятся одновременно… …почти
  • 18. Программа на С создает потоки, в каждом из которых свой экземпляр интерпретатора?
  • 19. Программа на С создает потоки, в каждом из которых свой экземпляр интерпретатора? GIL глобальный для процесса