Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
nexedi
cython
Commits
54db2a85
Commit
54db2a85
authored
Jul 03, 2008
by
Stefan Behnel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
EuroPython 2008 slides and examples
parent
6309d26b
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
430 additions
and
2 deletions
+430
-2
Doc/s5/Makefile
Doc/s5/Makefile
+9
-2
Doc/s5/cython-ep2008.txt
Doc/s5/cython-ep2008.txt
+403
-0
Doc/s5/ep2008/stupidlowercase.py
Doc/s5/ep2008/stupidlowercase.py
+9
-0
Doc/s5/ep2008/worker.py
Doc/s5/ep2008/worker.py
+9
-0
No files found.
Doc/s5/Makefile
View file @
54db2a85
SLIDES
=
$(
subst
.txt,.html,
$(
wildcard
*
.txt
))
SOURCES
=
$(
subst
.py,.c,
$(
subst
.pyx,.c,
$(
wildcard
*
/
*
.py
*
/
*
.pyx
)))
slides
:
$(SLIDES)
slides
:
$(SLIDES)
$(SOURCES)
%.html
:
%.txt
rst2s5
--current-slide
--language
=
en
$<
$@
%.c
:
%.py
cython
--annotate
$<
%.c
:
%.pyx
cython
--annotate
$<
clean
:
rm
-f
*
~
$(SLIDES)
rm
-f
*
~
$(SLIDES)
$(SOURCES)
$(
subst
.c,.html,
$(SOURCES)
)
Doc/s5/cython-ep2008.txt
0 → 100644
View file @
54db2a85
==============================================
The Cython Compiler for C-Extensions in Python
==============================================
Dr. Stefan Behnel
-----------------
.. class:: center
http://www.cython.org/
cython-dev@codespeak.net
.. footer:: Dr. Stefan Behnel, EuroPython 2008, Vilnius/Lietuva
.. include:: <s5defs.txt>
About myself
============
* Passionate Python developer since 2002
* after Basic, Logo, Pascal, Prolog, Scheme, Java, ...
* CS studies in Germany, Ireland, France
* PhD in distributed systems in 2007
* Language design for self-organising systems
* Darmstadt University of Technologies, Germany
* Current occupations:
* Employed by Senacor Technologies AG, Germany
* IT transformations, SOA design, Java-Development, ...
* »lxml« OpenSource XML toolkit for Python
* http://codespeak.net/lxml/
* Cython
What is Cython?
===============
Cython is
* an Open-Source project
* http://cython.org
* a Python compiler (almost)
* an enhanced, optimising fork of Pyrex
* an extended Python language for
* writing fast Python extension modules
* interfacing Python with C libraries
A little bit of history
=======================
* April 2002: release of Pyrex 0.1 by Greg Ewing
* Greg considers Pyrex a language in design phase
* Pyrex became a key language for many projects
* over the years, many people patched their Pyrex
* not all patches were answered by Greg (not in time)
* minor forks and enhanced branches followed
* March 2006: my fork of Pyrex for »lxml« XML toolkit
* November 2006: »SageX« fork of Pyrex
* by Robert Bradshaw, William Stein (Univ. Seattle, USA)
* context: »Sage«, a free mathematics software package
* 28th July 2007: official Cython launch
* integration of lxml's Pyrex fork into SageX
* the rest is in http://hg.cython.org/cython-devel/
Major Cython Developers
=======================
* Robert Bradshaw and Stefan Behnel
* lead developers
* Greg Ewing
* main developer and maintainer of Pyrex
* we happily share code and discuss ideas
* Dag Sverre Seljebotn
* Google Summer-of-Code developer
* NumPy integration, many ideas and enhancements
* many, *many* others - see
* http://cython.org/
* the mailing list archives of Cython and Pyrex
How to use Cython
=================
* you write Python code
* Cython translates it into C code
* your C compiler builds a shared library for CPython
* you import your module
* Cython has support for
* compile-time includes/imports
* with dependency tracking
* distutils
* *optionally* compile Python code from setup.py!
Example: compiling Python code
==============================
.. sourcecode:: bash
$ cat worker.py
.. sourcecode:: python
class HardWorker(object):
u"Almost Sisyphus"
def __init__(self, task):
self.task = task
def work_hard(self):
for i in range(100):
self.task()
.. sourcecode:: bash
$ cython worker.py
* translates to 842 line `.c file <ep2008/worker.c>`_ (Cython 0.9.8)
* lots of portability #define's
* tons of helpful C comments with Python code snippets
* a lot of code that you don't want to write yourself
Portable Code
=============
* Cython compiler generates C code that compiles
* with all major compilers (C and C++)
* on all major platforms
* in Python 2.3 to 3.0 beta1
* Cython language syntax follows Python 2.6
* optional Python 3 syntax support is on TODO list
* get involved to get it quicker!
\... the fastest way to port Python 2 code to Py3 ;-)
Python 2 feature support
========================
* most of Python 2 syntax is supported
* top-level classes and functions
* exceptions
* object operations, arithmetic, ...
* plus some Py3/2.6 features:
* keyword-only arguments
* unicode literals via ``__future__`` import
* in recent developer branch:
* ``with`` statement
* closures
* support for local classes and functions is close!
Speed
=====
Cython generates very efficient C code
* according to PyBench:
* conditions and loops run 2-8x faster than in Py2.5
* most benchmarks run 30%-80% faster
* overall more than 30% faster for plain Python code
* optional type declarations
* let Cython generate plain C instead of C-API calls
* make code several times faster than the above
Type declarations
=================
* »cdef« keyword declares
* local variables with C types
* functions with C signatures
* classes as builtin extension types
* Example::
def stupid_lower_case(char* s):
cdef Py_ssize_t size, i
size = len(s)
for i in range(size):
if s[i] >= 'A' and s[i] <= 'Z':
s[i] += 'a' - 'A'
return s
Why is this stupid?
===================
Ask Cython!
.. sourcecode:: bash
$ cat stupidlowercase.py
::
def stupid_lower_case(char* s):
cdef Py_ssize_t size, i
size = len(s)
for i in range(size):
if s[i] >= 'A' and s[i] <= 'Z':
s[i] += 'a' - 'A'
return s
.. sourcecode:: bash
$ cython --annotate stupidlowercase.py
=> `stupidlowercase.html <ep2008/stupidlowercase.html>`_
Calling C functions
===================
* Example::
cdef extern from "Python.h":
# copied from the Python C-API docs:
object PyUnicode_DecodeASCII(
char* s, Py_ssize_t size, char* errors)
cdef extern from "string.h":
int strlen(char *s)
cdef slightly_better_lower_case(char* s):
cdef Py_ssize_t i, size = strlen(s)
for i in range(size):
if s[i] >= 'A' and s[i] <= 'Z':
s[i] += 'a' - 'A'
return PyUnicode_DecodeASCII(s, size, NULL)
Cutting-edge features
=====================
* Dynamic classes and functions with closures
.. sourcecode:: python
def myfunction(a,b):
def closure_function(c):
return a+b+c
return closure_function
* Native support for new ``buffer`` protocol this summer
* part of NumPy integration by Dag Seljebotn
.. sourcecode:: python
def inplace_negative_grayscale_image(
ndarray[unsigned char, 2] image):
cdef int i, j
for i in range(image.shape[0]):
for j in range(image.shape[1]):
arr[i, j] = 255 - arr[i, j]
Huge pile of great ideas
========================
* Cython Enhancement Proposals (CEPs)
* http://wiki.cython.org/enhancements
* native pickle support for extension classes
* meta-programming facilities
* type inference strategies
* compile-time assertions for optimisations
* object-like C-array handling
* improved C++ integration
* ...
Conclusion
==========
* Cython is a tool for
* efficiently translating Python code to C
* easily interfacing to external C libraries
* Use it to
* speed up existing Python modules
* concentrate on optimisations, not rewrites!
* write C extensions for CPython
* don't change the language just to get fast code!
* wrap C libraries *in Python*
* concentrate on the mapping, not the glue!
... but Cython is also
======================
* a great project
* a very open playground for great ideas!
Cython
======
**Cython**
**C-Extensions in Python**
\... use it, and join the project!
http://cython.org/
Doc/s5/ep2008/stupidlowercase.py
0 → 100644
View file @
54db2a85
def
stupid_lower_case
(
char
*
s
):
cdef
Py_ssize_t
size
,
i
size
=
len
(
s
)
for
i
in
range
(
size
):
if
s
[
i
]
>=
'A'
and
s
[
i
]
<=
'Z'
:
s
[
i
]
+=
'a'
-
'A'
return
s
Doc/s5/ep2008/worker.py
0 → 100644
View file @
54db2a85
class
HardWorker
(
object
):
u"Almost Sisyphus"
def
__init__
(
self
,
task
):
self
.
task
=
task
def
work_hard
(
self
):
for
i
in
range
(
100
):
self
.
task
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment