Недостатки Python

1,471 views
1,218 views

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,471
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
23
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Недостатки Python

  1. 1. Python imperfections Cyril @notorca Lashkevich
  2. 2. Элементы функционального стиля Python не функциональный язык Но иногда хочется… … или случайно получается
  3. 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. 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. 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. 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. 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. 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. 9. Генераторы и yield Возможность удобно использовать генераторы в генераторах появилась только в 3.3, PEP 380 yield form Даже с этим генераторы слабее более общей концепции coroutines yield не функция, а синтаксический элемент привязанный к контексту, не first-class citizen
  10. 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. 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. 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. 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)
  14. 14. Неоднородность Object Model weakref __slots__ __del__ new/old style objects
  15. 15. Bytecode ~110 инструкции байткода (39 в Lua) PyObject * PyEval_EvalFrameEx(PyFrameObject *f,
 int throwflag) { // ~2200 lines } void luaV_execute (lua_State *L) { // 320 lines }
  16. 16. API Объемный и сложный в использовании 818 функции (3.3) vs 123 + 66 aux в Lua Не все гладко с Py_Initialize/Py_Finalize
  17. 17. GIL Глобальный для процесса семафор/ conditional variable Не дает нескольким потокам выполнятся одновременно… …почти
  18. 18. Программа на С создает потоки, в каждом из которых свой экземпляр интерпретатора?
  19. 19. Программа на С создает потоки, в каждом из которых свой экземпляр интерпретатора? GIL глобальный для процесса
  20. 20. The End Cyril @notorca Lashkevich

×