Python
(2018-02-27)
Masahiro Sakai ( )
PYTHON
• Twitter: @masahiro_sakai
github: https://github.com/msakai/
G+: https://plus.google.com/+MasahiroSakai
• :
( )
• :
– ( Haskell)
–
–
•
• Python
• Python
•
……
• Haskell
– Haskell ( )
• Ruby
–
( Python )
– Ruby-GNOME2
• Python
– Chainer + α
– PyPI
DISCLAIMER
•
Python
–
–
–
• Python
–
•
•
•
•
•
– R MATLAB
•
– numpy/scipy, pandas, scikit-learn, matplotlib, Jupyter
Notebook,
–
Python
• ……
Python
• ) numpy.array ==
– numpy …
– Python
⇒
– sorted([np.zeros(2), np.zeros(2)])
• ( collections-extended
RangeMap )
: ……
• ……
•
……
• ) pandas itertuples
type(next(pd.DataFrame({"x" + str(i): [i] for i in range(253)}).itertuples()))
#=> pandas.core.frame.Pandas
type(next(pd.DataFrame({"x" + str(i): [i] for i in range(254)}).itertuples()))
#=> tuple
: Lisp-1
•
– Scheme, JavaScript
– Common Lisp, Ruby Lisp-2 ( )
•
Python Ruby
obj.foo(args) obj.foo(args)
( ) obj.foo() obj.foo(), obj.foo
obj.foo obj.method(:foo)
m(args) m.call(args), m[args]
: Lisp-1
• ……
→
→
• Ruby Lisp-2
•
•
Python Ruby
obj.foo(…) obj.foo(…), obj.foo …
( ) obj.foo() obj.foo(), obj.foo
obj.foo obj.method(:foo)
m(…) m.call(…), m[…]
• (PEP 484)
• mypy
def greeting(name: str) -> str:
return 'Hello ' + name
print(greeting(0))
# => error: Argument 1 to "greeting" has incompatible
type "int"; expected "str"
• Haskeller
–
–
•
– →
• Python Haskell
–
• List Tuple List
……
• (gradual typing)
– (dynamic typing) (static typing)
– Jeremy G. Siek and Walid Taha, Gradual Typing for Functional Languages, in
Proceedings of the 2006 Scheme and Functional Programming Workshop
•
– dynamic type: Any … Any
– type consistency relation: A B
• A = B Any
( : int→Any Any→str)
–
int ⊑ Any ⊑ str
•
(1)
(2)
•
– Python (mypy), TypeScript, Closure, Hack, Flow, C#?
–
• Python
–
• Python (mypy)
• ……
– (Any )
• e.g. Blame Calculus ( )
• Python (mypy)
• :
• (np.array, chainer.Variable )
⇒
• shape
– shape
•
( : forward backward )
(1)
def __call__(self, x : np.array) -> np.array:
• shape Array(m,n,o)
……
– reshape
⇒ (c.f. )
– Haskell hmatrix API †
……
•
(2)
† https://hackage.haskell.org/package/hmatrix-0.18.2.0/docs/Numeric-LinearAlgebra-Static.html
: Chainer
• Chainer
DSL
–
–
type_check.expect(in_types[0].shape == in_types[1].shape)
Expect: in_types[0].shape == in_types[1].shape
Actual: (3,) != (2,)
http://blog.unnono.net/2015/10/chainer-typecheck.html
(3)
•
•
…
•
• CPython
• GPU CPU
– Python
……
– NN CPU
– GPU
……
numpy
• numpy
• numpy
( numpy )
– : x[np.arange(x.shape[0])[:, None], p]
–
•
•
( 1 540 2.1GB )
parsy-1.1.0 290m7.032s
pyparsing-2.2.0 562m41.623s
funcparserlib-0.3.6 79m45.315s
megaparsec-5.3.1 (Haskell) 18m12.025s
attoparsec-0.13.1.0 (Haskell) 15m46.415s
: Python str Haskell
ByteString(bytes )
• :
–
–
……
• Cython
–
–
•
–
CPython
(Go )
• GIL (Global Interpreter Lock)
–
CPython
……
ONNX-Chainer ……
• Python
• Python
–
– Python
•

関数プログラマから見たPythonと機械学習