Недостатки python

20
Python imperfections Cyril @notorca Lashkevich

Upload: python-meetup

Post on 10-May-2015

774 views

Category:

Technology


2 download

DESCRIPTION

В докладе раскрыты слабые места Python, проблемы с GC, функциональным стилем, реализацией стандартных структур данных и интерпретатора CPython. Автор: Кирилл Лашкевич

TRANSCRIPT

Page 1: Недостатки Python

Python imperfectionsCyril @notorca Lashkevich

Page 2: Недостатки Python

Элементы функционального стиля

Python не функциональный язык

Но иногда хочется…

… или случайно получается

Page 3: Недостатки 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)

Page 4: Недостатки Python

>> d = add(empty, 1, "abc") >> d = add_f(d, 2, "def") >> d(1) 'abc' >> d(2) 'def' >> d(0) >>

Разминка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)

Page 5: Недостатки Python

Захват переменных в замыканияdef Counter(x): a = x def zero(): a = 0 def val(): return a def inc(): a += 1 return a return (zero, val, inc)

Page 6: Недостатки Python

Захват переменных в замыканияdef Counter(x): a = x def zero(): a = 0 def val(): return a def inc(): a += 1 return a return (zero, val, inc)

>> zero, val, inc = Counter(5) >> zero() >> val() 5 >> inc()

Page 7: Недостатки Python

Захват переменных в замыканияdef Counter(x): a = x def zero(): a = 0 def val(): return a def inc(): a += 1 return a return (zero, val, inc)

>> zero, val, inc = Counter(5) >> zero() >> val() 5 >> inc()

UnboundLocalError:local variable 'a'referenced beforeassignment

Page 8: Недостатки Python

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)

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)

3.x 2.x

Page 9: Недостатки Python

Генераторы и yield

Возможность удобно использовать генераторы в генераторах появилась только в 3.3, PEP 380 yield form

Даже с этим генераторы слабее более общей концепции coroutines

yield не функция, а синтаксический элемент привязанный к контексту, не first-class citizen

Page 10: Недостатки Python

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)

Page 11: Недостатки Python

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)

>> 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]

Page 12: Недостатки Python

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)

Page 13: Недостатки Python

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)

Page 14: Недостатки Python

Неоднородность Object Model

weakref

__slots__

__del__

new/old style objects

Page 15: Недостатки Python

Bytecode

PyObject * PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) { // ~2200 lines }

~110 инструкции байткода (39 в Lua)

void luaV_execute (lua_State *L) { // 320 lines }

Page 16: Недостатки Python

API

Объемный и сложный в использовании

818 функции (3.3) vs 123 + 66 aux в Lua

Не все гладко с Py_Initialize/Py_Finalize

Page 17: Недостатки Python

GIL

Глобальный для процесса семафор/conditional variable

Не дает нескольким потокам выполнятся одновременно…

…почти

Page 18: Недостатки Python

Программа на С создает потоки, в каждом из которых свой экземпляр интерпретатора?

Page 19: Недостатки Python

Программа на С создает потоки, в каждом из которых свой экземпляр интерпретатора?

GIL глобальный для процесса

Page 20: Недостатки Python

The EndCyril @notorca Lashkevich