Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #370 from tommy3001/master

Cython description and code example added
  • Loading branch information...
commit 9427b020d34b9d943769376abec791d095178c0f 2 parents f527049 + b8f9923
Kenneth Reitz authored
Showing with 132 additions and 0 deletions.
  1. +132 −0 docs/scenarios/speed.rst
132 docs/scenarios/speed.rst
View
@@ -68,6 +68,138 @@ C Extensions
Cython
------
+With `Cython <http://cython.org/>`_ you are able to write C and C++ modules for Python. It implements a superset of the Python language.
+You are also able to call C-functions and realize declaration of variables and functions like in C. Here is an example:
+
+.. code-block:: python
+
+ def primes(int kmax):
+ """Calculation of prime numbers with additional
+ Cython keywords"""
+
+ cdef int n, k, i
+ cdef int p[1000]
+ result = []
+ if kmax > 1000:
+ kmax = 1000
+ k = 0
+ n = 2
+ while k < kmax:
+ i = 0
+ while i < k and n % p[i] != 0:
+ i = i + 1
+ if i == k:
+ p[k] = n
+ k = k + 1
+ result.append(n)
+ n = n + 1
+ return result
+
+
+This implementation of an algorithm to find prime numbers has some additional keywords instead of the next one, which is implemented in pure Python:
+
+.. code-block:: python
+
+
+ def primes(kmax):
+ """Calculation of prime numbers in standard Python syntax"""
+
+ p= range(1000)
+ result = []
+ if kmax > 1000:
+ kmax = 1000
+ k = 0
+ n = 2
+ while k < kmax:
+ i = 0
+ while i < k and n % p[i] != 0:
+ i = i + 1
+ if i == k:
+ p[k] = n
+ k = k + 1
+ result.append(n)
+ n = n + 1
+ return result
+
+
+
+The only difference between the both algorithm is this part:
+
+
+.. code-block:: python
+
+ def primes(int kmax):
+ """Calculation of prime numbers with additional
+ Cython keywords"""
+
+ cdef int n, k, i
+ cdef int p[1000]
+ result = []
+
+
+.. code-block:: python
+
+ def primes(kmax):
+ """Calculation of prime numbers in standard Python syntax"""
+
+ p= range(1000)
+ result = []
+
+What is the difference? In the upper Cython version you can see the declaration of the variable types and the integer array
+in a similar way like in standard C. For example `cdef int n,k,i` in line 3. This additional type declaration (e.g. integer)
+allows the Cython compiler to generate more efficient C code from the second code. While standard Python code is saved in `*.py` files,
+Cython code is saved in `*.pyx` files.
+
+And what is with the speed? So lets try it!
+
+.. code-block:: python
+
+ import time
+ #activate pyx compiler
+ import pyximport
+ pyximport.install()
+ #primes implemented with Cython
+ import primesCy
+ #primes implemented with Python
+ import primes
+
+ print "Cython:"
+ t1= time.time()
+ print primesCy.primes(500)
+ t2= time.time()
+ print "Cython time: %s" %(t2-t1)
+ print ""
+ print "Python"
+ t1= time.time()
+ print primes.primes(500)
+ t2= time.time()
+ print "Python time: %s" %(t2-t1)
+
+
+These both lines need a remark:
+
+.. code-block:: python
+
+ import pyximport
+ pyximport.install()
+
+
+The `pyximport` module allows you to import `pyx` files (e.g., `primesCy.pyx`) with the Cython-compiled version of the `primes` function.
+The `pyximport.install()` command allows the Python interpreter to start the Cython compiler directly to generate C-code,
+which is automatically compiled to a `*.so` C-library. Cython is able to import this library for you in your Python-code.
+Very easy and very efficient. With the `time.time()` function you are able to compare the time between this 2 different calls to find 500 prime numbers.
+
+On a standard notebook (dualcore AMD E-450 1,6 GHz) the measured values are:
+
+Cython time: 0.0054 seconds
+
+Python time: 0.0566 seconds
+
+And here the output of an embedded `ARM beaglebone <http://beagleboard.org/Products/BeagleBone>`_ machine:
+
+Cython time: 0.0196 seconds
+
+Python time: 0.3302 seconds
Pyrex
-----
Please sign in to comment.
Something went wrong with that request. Please try again.