Welcome to Cython!
Cython is an optimising Python compiler that makes writing C extensions for Python as easy as Python itself.
Cython translates Python code to C/C++ code, but additionally supports calling C functions and declaring C types on variables and class attributes. This allows broad to fine-grained manual tuning that lets the compiler generate very efficient C code from Cython code.
This makes Cython the ideal language for wrapping external C libraries, and for fast C modules that speed up the execution of Python code.
- Official website: https://cython.org/
- Documentation: https://docs.cython.org/
- Github repository: https://github.com/cython/cython
- Wiki: https://github.com/cython/cython/wiki
Cython has more than 70 million downloads per month on PyPI. You can support the Cython project via Github Sponsors or Tidelift.
Installation:
If you already have a C compiler, just run following command:
pip install Cython
otherwise, see the installation page.
License:
The original Pyrex program, which Cython is based on, was licensed "free of restrictions" (see below). Cython itself is licensed under the permissive Apache License.
See LICENSE.txt.
Contributing:
Want to contribute to the Cython project? Here is some help to get you started.
Differences to other Python compilers
Started as a project in the early 2000s, Cython has outlived most other attempts at producing static compilers for the Python language.
Similar projects that have a relevance today include:
- PyPy, a Python implementation with a JIT
compiler.
- Pros: JIT compilation with runtime optimisations, fully language compliant, good integration with external C/C++ code
- Cons: non-CPython runtime, relatively large resource usage of the runtime, limited compatibility with CPython extensions, non-obvious performance results
- Numba, a Python extension that features
a JIT compiler for a subset of the language, based on the LLVM
compiler infrastructure (probably best known for its
clang
C compiler). It mostly targets numerical code that uses NumPy.- Pros: JIT compilation with runtime optimisations
- Cons: limited language support, relatively large runtime dependency (LLVM), non-obvious performance results
- Pythran, a static Python-to-C++ extension compiler for a subset of the language, mostly targeted at numerical computation. Pythran can be (and is probably best) used as an additional backend for NumPy code in Cython.
- mypyc, a static Python-to-C
extension compiler, based on the mypy
static Python analyser. Like Cython's pure Python
mode,
mypyc can make use of PEP-484 type annotations to optimise code for
static types.
- Pros: good support for language and PEP-484 typing, good type inference, reasonable performance gains
- Cons: no support for low-level optimisations and typing, opinionated Python type interpretation, reduced Python compatibility and introspection after compilation
- Nuitka, a static Python-to-C extension
compiler.
- Pros: highly language compliant, reasonable performance gains, support for static application linking (similar to cython_freeze but with the ability to bundle library dependencies into a self-contained executable)
- Cons: no support for low-level optimisations and typing
In comparison to the above, Cython provides
- fast, efficient and highly compliant support for almost all Python language features, including dynamic features and introspection
- full runtime compatibility with all still-in-use and future versions of CPython
- "generate once, compile everywhere" C code generation that allows for reproducible performance results and testing
- C compile time adaptation to the target platform and Python version
- support for other C-API implementations, including PyPy and Pyston
- seamless integration with C/C++ code
- broad support for manual optimisation and tuning down to the C level
- a large user base with thousands of libraries, packages and tools
- more than two decades of bug fixing and static code optimisations
The following is from Pyrex:
Cython was originally based on Pyrex by Greg Ewing, with the following written in the Pyrex readme document:
This is a development version of Pyrex, a language for writing Python extension modules.
For more info, take a look at:
- Doc/About.html for a description of the language
- INSTALL.txt for installation instructions
- USAGE.txt for usage instructions
- Demos for usage examples
Comments, suggestions, bug reports, etc. are most welcome!
Copyright stuff: Pyrex is free of restrictions. You may use, redistribute, modify and distribute modified versions.
The latest version of Pyrex can be found here.
| Greg Ewing, Computer Science Dept | University of Canterbury | Christchurch, New Zealand
A citizen of NewZealandCorp, a wholly-owned subsidiary of USA Inc.