Skip to content

Commit

Permalink
python optim slide
Browse files Browse the repository at this point in the history
  • Loading branch information
yihuang committed Aug 31, 2013
1 parent 2e45a8f commit b7d573e
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 35 deletions.
69 changes: 53 additions & 16 deletions slide/python-optim/python-optim.html
Expand Up @@ -680,7 +680,6 @@ <h1>简化设计</h1>
<ul class="incremental simple">
<li>KISS, KISS, KISS</li>
<li>没什么好说的</li>
<li>就像</li>
</ul>
</div>
<div class="slide" id="id12">
Expand All @@ -700,14 +699,14 @@ <h1>啥是Cython</h1>
</ul>
</div>
<div class="slide" id="id13">
<h1>编译纯Python的好处</h1>
<ul class="incremental">
<li><p class="first">没有解释执行的开销</p>
</li>
<h1>编译纯Python,消除解释执行的开销</h1>
<ul>
<li><div class="first"><div class="highlight"><pre><span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</pre></div>
</div></li>
</ul>
<ul class="incremental">
<li><div class="first"><div class="highlight"><pre><span class="n">PyObject</span> <span class="o">*</span><span class="nf">test</span><span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="p">{</span>
<span class="n">PyObject</span> <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="n">PyTuple_GET_ITEM</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="n">PyObject</span> <span class="o">*</span><span class="n">b</span> <span class="o">=</span> <span class="n">PyTuple_GET_ITEM</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
Expand All @@ -717,30 +716,68 @@ <h1>编译纯Python的好处</h1>
</div></li>
</ul>
</div>
<div class="slide" id="id14">
<h1>给Python加入类型签名</h1>
<ul class="incremental">
<li><div class="first"><div class="highlight"><pre><span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="nb">int</span> <span class="n">a</span><span class="p">,</span> <span class="nb">int</span> <span class="n">b</span><span class="p">):</span>
<div class="slide" id="cdef">
<h1>cdef 消除名字查找和函数调用的开销</h1>
<ul>
<li><div class="first"><div class="highlight"><pre><span class="n">cdef</span> <span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>

<span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="n">cdef</span> <span class="nb">int</span> <span class="n">i</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</pre></div>
</div></li>
</ul>
</div>
<div class="slide" id="id14">
<h1>cdef 消除名字查找和函数调用的开销</h1>
<ul>
<li><div class="first"><div class="highlight"><pre><span class="n">PyObject</span> <span class="o">*</span><span class="nf">test</span><span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="p">{</span>
<span class="n">PyObject</span> <span class="o">*</span><span class="n">pya</span> <span class="o">=</span> <span class="n">PyTuple_GET_ITEM</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="n">PyObject</span> <span class="o">*</span><span class="n">pyb</span> <span class="o">=</span> <span class="n">PyTuple_GET_ITEM</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">100</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="n">add</span><span class="p">(</span><span class="n">pya</span><span class="p">,</span> <span class="n">pyb</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div></li>
</ul>
</div>
<div class="slide" id="python-c">
<h1>给Python加入类型签名,无限接近纯C</h1>
<ul>
<li><div class="first"><div class="highlight"><pre><span class="n">cdef</span> <span class="nb">int</span> <span class="n">add</span><span class="p">(</span><span class="nb">int</span> <span class="n">a</span><span class="p">,</span> <span class="nb">int</span> <span class="n">b</span><span class="p">):</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>

<span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="n">cdef</span> <span class="nb">int</span> <span class="n">i</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</pre></div>
</div></li>
</ul>
<ul class="incremental">
<li><div class="first"><div class="highlight"><pre><span class="kt">int</span> <span class="nf">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">PyObject</span> <span class="o">*</span><span class="nf">test</span><span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="p">{</span>
<span class="n">PyObject</span> <span class="o">*</span><span class="n">pya</span> <span class="o">=</span> <span class="n">PyTuple_GET_ITEM</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="n">PyObject</span> <span class="o">*</span><span class="n">pyb</span> <span class="o">=</span> <span class="n">PyTuple_GET_ITEM</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="n">__Pyx_PyInt_AsInt</span><span class="p">(</span><span class="n">pya</span><span class="p">);</span>
<span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="n">__Pyx_PyInt_AsInt</span><span class="p">(</span><span class="n">pyb</span><span class="p">);</span>
<span class="k">return</span> <span class="n">PyInt_FromLong</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">);</span>
<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">100</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="n">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div></li>
</ul>
</div>
<div class="slide" id="cdef-early-binding">
<h1>cdef Early binding</h1>
<p>cdef</p>
</div>
<div class="slide" id="cdef-method">
<h1>cdef Method</h1>
<div class="slide" id="extension-type">
<h1>Extension Type</h1>
<p>TODO</p>
</div>
</div>
</body>
Expand Down
68 changes: 49 additions & 19 deletions slide/python-optim/python-optim.rst
Expand Up @@ -362,8 +362,6 @@ object model

* 没什么好说的

* 就像

大纲
====

Expand All @@ -380,18 +378,16 @@ object model
* 完全兼容python2/3的语法
* 提供扩展语法用于对接c

编译纯Python的好处
==================

.. class:: incremental

* 没有解释执行的开销
编译纯Python,消除解释执行的开销
================================

* .. code-block:: python

def test(a, b):
return a + b

.. class:: incremental

* .. code-block:: c

PyObject *test(PyObject *args) {
Expand All @@ -400,30 +396,64 @@ object model
return PyNumber_Add(a, b);
}
给Python加入类型签名
====================
cdef 消除名字查找和函数调用的开销
=================================

.. class:: incremental
* .. code-block:: python

cdef add(a, b):
return a + b

def test(a, b):
cdef int i
for i in range(100):
add(a, b)

cdef 消除名字查找和函数调用的开销
=================================

* .. code-block:: c

PyObject *test(PyObject *args) {
PyObject *pya = PyTuple_GET_ITEM(args, 0);
PyObject *pyb = PyTuple_GET_ITEM(args, 1);
for(int i=0; i<100; i++) {
add(pya, pyb);
}
}
给Python加入类型签名,无限接近纯C
=================================

* .. code-block:: python

def test(int a, int b):
cdef int add(int a, int b):
return a + b

def test(a, b):
cdef int i
for i in range(100):
add(a, b)

.. class:: incremental

* .. code-block:: c

int add(int a, int b) {
return a + b;
}

PyObject *test(PyObject *args) {
PyObject *pya = PyTuple_GET_ITEM(args, 0);
PyObject *pyb = PyTuple_GET_ITEM(args, 1);
int a = __Pyx_PyInt_AsInt(pya);
int b = __Pyx_PyInt_AsInt(pyb);
return PyInt_FromLong(a + b);
for(int i=0; i<100; i++) {
add(a, b);
}
}
cdef Early binding
==================

cdef
Extension Type
==============

cdef Method
===========
TODO

0 comments on commit b7d573e

Please sign in to comment.