Content deleted Content added
m Undid revision 792721227 by Special:Contributions/2600:6C58:627F:E8CA:81C8:2AF8:BECD:F3D4 |
Ascchrvalstr (talk | contribs) m Copyedit |
||
(143 intermediate revisions by 90 users not shown) | |||
Line 1:
{{Distinguish|CPython}}
{{Use dmy dates|date=February 2014}}
{{short description|Programming language}}
{{Infobox programming language
| name = Cython
| logo
| developer = Robert Bradshaw, Stefan Behnel, et al.
| released = {{Start date and age|df=yes|2007|07|28}}<ref>{{cite web |url=https://www.behnel.de/cythonEP2008/cython-ep2008.html |type=28 July 2007: official Cython launch |title=The Cython Compiler for C-Extensions in Python |last=Behnel |first=Stefan |work=EuroPython |date=2008 |publisher=Vilnius/Lietuva}}</ref>
| license = [[Apache License 2.0]]
| programming language = [[Python (programming language)|Python]]
| influenced_by = [[C (programming language)|C]], [[Python (programming language)|Python]]
| operating_system = [[Windows]], [[macOS]], [[Linux]]
| file_ext = .pyx, .pxd, .pxi<ref>{{Cite web |title=Language Basics — Cython 3.0.0a9 documentation |url=https://cython.readthedocs.io/en/latest/src/userguide/language_basics.html#cython-file-types |access-date=9 September 2021 |website=cython.readthedocs.io}}</ref>
| website = {{official URL}}
}}
'''Cython''' ({{IPAc-en|ˈ|s|aɪ|θ|ɒ|n}}) is a [[superset]] of the programming language [[Python (programming language)|Python]],
Cython is a [[compiled language]] that
Cython is written in Python and C and works on [[Microsoft Windows|Windows]], [[macOS]], and [[Linux]], producing C source files compatible with CPython 2.6, 2.7, and 3.3
Cython 3.0.0 was released on 17 July 2023.<ref>{{Cite web |title=Cython Changelog |url=https://cython.readthedocs.io/en/latest/src/changes.html |access-date=21 July 2023 |website=cython.org |language=en}}</ref>
== Design ==
Cython works by producing a standard Python module. However, the behavior differs from standard Python in that the module code, originally written in Python, is translated into C. While the resulting code is fast, it makes many calls into the CPython interpreter and CPython standard libraries to perform actual work. Choosing this arrangement saved considerably on Cython's development time, but modules have a dependency on the Python interpreter and standard library.
Although most of the code is C-based, a small stub loader written in interpreted Python is usually required (unless the goal is to create a loader written entirely in C, which may involve work with the undocumented internals of CPython). However, this is not a major problem due to the presence of the Python interpreter.<ref>{{Cite web |title=Basic Tutorial — Cython 3.0a6 documentation |url=https://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html |access-date=11 December 2020 |website=cython.readthedocs.io}}</ref>
Cython has a [[foreign function interface]] for invoking [[C (programming language)|C]]/[[C++]] [[subroutine|routines]] and the ability to declare the [[static type]] of subroutine parameters and results, local variables, and class attributes.
A Cython program that implements the same algorithm as a corresponding Python program may consume fewer computing resources such as core memory and processing cycles due to differences between the CPython and Cython execution models. A basic Python program is loaded and executed by the CPython [[virtual machine]], so both the runtime and the program itself consume computing resources. A Cython program is compiled to C code, which is further compiled to machine code, so the virtual machine is used only briefly when the program is loaded.<ref>{{cite web |last=Oliphant |first=Travis |date=
</ref><ref name="scipy09">{{cite book |last=Seljebot |first=Dag Sverre |title=Proceedings of the 8th Python in Science Conference |chapter=Fast numerical computations with Cython |year=2009 |pages=15–22 |doi=10.25080/GTCA8577 |chapter-url=http://conference.scipy.org/proceedings/SciPy2009/paper_2|doi-access=free }}</ref><ref>{{cite journal |last1=Wilbers |first1=I. |last2=Langtangen |first2=H. P. |last3=Ødegård |first3=Å. |year=2009 |title=Using Cython to Speed up Numerical Python Programs |journal=Proceedings of MekIT'09 |pages=495–512 |url=http://simula.no/research/sc/publications/Simula.SC.578/simula_pdf_file |access-date=14 June 2011 |format=PDF |editor1-first=B. |editor1-last=Skallerud |editor2-first=H. I. |editor2-last=Andersson |archive-date=4 January 2017 |archive-url=https://web.archive.org/web/20170104170007/http://simula.no/research/sc/publications/Simula.SC.578/simula_pdf_file |url-status=dead }}</ref>
Cython employs:
* Optimistic optimizations
* [[Type inference]] (optional)
* Low overhead in control structures
* Low function call overhead<ref>{{cite web |url=http://telecom.inescporto.pt/~gjc/pybindgen-benchmarks/ |title=wrapper benchmarks for several Python wrapper generators (except Cython) |access-date=28 May 2010 |archive-url=https://web.archive.org/web/20150404154630/http://telecom.inescporto.pt/~gjc/pybindgen-benchmarks/ |archive-date=4 April 2015 |url-status=dead}}</ref><ref>{{cite web |url=
Performance depends both on what C code is generated by Cython and how that code is compiled by the C compiler.<ref>{{cite web |title=Cython: C-Extensions for Python |url=http://cython.org/index.html |accessdate=22 November 2015}}</ref>
== History ==
Cython is a derivative of the [[Pyrex (programming language)|Pyrex language]],
Cython files have a <code>.pyx</code> extension. At its most basic, Cython code looks exactly like Python code. However, whereas standard Python is [[dynamic typing|dynamically typed]], in Cython, types can optionally be provided, allowing for improved performance, allowing loops to be converted into C loops where possible. For example:
<
def primes(int kmax):
# These variables are declared with C types.
cdef int n, k, i
# Another C type
cdef int p[1000]
# A Python type
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
</syntaxhighlight>
== Example ==
[[File:Cython CPython Ext Module Workflow.png|thumb|Hello World in Cython]]
A sample [["Hello, World!" program|hello world]] program for Cython is more complex than in most languages because it interfaces with the Python C API and
* A <code>setup.py</code> file to invoke the <code>setuptools</code> build process that generates the extension module
Line 95 ⟶ 91:
The following code listings demonstrate the build and launch process:
<
# hello.pyx - Python
def say_hello():
print
</syntaxhighlight>
<
# launch.py - Python stub loader, loads the module that was made by Cython.
Line 109 ⟶ 105:
import hello
hello.say_hello()
</syntaxhighlight>
<
# setup.py - unnecessary if not redistributing the code, see below
from setuptools import setup
from Cython.Build import cythonize
setup(name =
ext_modules = cythonize("*.pyx"))
</syntaxhighlight>
These commands build and launch the program:
<
$ python setup.py build_ext --inplace
$ python launch.py
</syntaxhighlight>
== Using in IPython/Jupyter notebook ==
A more straightforward way to start with Cython is through command-line [[IPython]] (or through in-browser python console called Jupyter [[notebook interface|notebook]]):
<syntaxhighlight lang="cython">
In [1]: %load_ext Cython
In [2]: %%cython
...: def f(n):
...: a = 0
...: for i in range(n):
...: a += i
...: return a
...:
...: cpdef g(int n):
...: cdef long a = 0
...: cdef int i
...: for i in range(n):
...: a += i
...: return a
...:
In [3]: %timeit f(1000000)
10 loops, best of 3: 26.5 ms per loop
In [4]: %timeit g(1000000)
1000 loops, best of 3: 279 µs per loop
</syntaxhighlight>
which gives a 95 times improvement over the pure-python version. More details on the subject in the official quickstart page.<ref>{{Cite web |url=https://cython.readthedocs.io/en/latest/src/quickstart/build.html |title=Building Cython code |website=cython.readthedocs.io |access-date=24 April 2017}}</ref>
== Uses ==
Cython is particularly popular among scientific users of Python,<ref name="scipy09" /><ref>{{cite web |title=inSCIght: The Scientific Computing Podcast |url=http://inscight.org/2011/03/31/episode_/ |type=Episode 6 |access-date=29 May 2011 |archive-url=https://web.archive.org/web/20141010032300/http://inscight.org/2011/03/31/episode_/ |archive-date=10 October 2014 |url-status=dead}}</ref><ref>{{cite journal |last1=Millman |first1=Jarrod |last2=Aivazis |first2=Michael |year=2011 |title=Python for Scientists and Engineers |journal=[[Computing in Science and Engineering]] |volume=13 |issue=2 |pages=9–12 |doi=10.1109/MCSE.2011.36 |bibcode=2011CSE....13b...9M |url=https://escholarship.org/uc/item/93s2v2s7}}</ref> where it has "the perfect audience" according to Python creator [[Guido van Rossum]].<ref>{{cite web |author=Guido Van Rossum |url=https://mail.python.org/pipermail/python-dev/2011-March/109634.html |title=Re: VM and Language summit info for those not at Pycon (and those that are!) |type=Message to the electronic mailing-list <code>python-dev</code>|date=21 March 2011 |access-date=5 May 2011}}</ref> Of particular note:
* The [[free software]] [[SageMath]] computer algebra system depends on Cython, both for performance and to interface with other libraries.<ref>{{cite book |last1=Erocal |first1=Burcin |last2=Stein |first2=William |title=Mathematical Software – ICMS 2010 |chapter=The Sage Project: Unifying Free Mathematical Software to Create a Viable Alternative to Magma, Maple, Mathematica and MATLAB |year=2010 |volume=6327 |pages=12–27 |publisher=Springer Berlin / Heidelberg |doi=10.1007/978-3-642-15582-6_4 |url=http://wstein.org/papers/icms/icms_2010.pdf |series=Lecture Notes in Computer Science |isbn=978-3-642-15581-9 |citeseerx=10.1.1.172.624}}</ref>
* Significant parts of the scientific computing libraries [[SciPy]], [[Pandas (software)|pandas]] and [[scikit-learn]] are written in Cython.<ref>{{cite web |url=http://docs.scipy.org/doc/scipy/reference/release.0.7.2.html |title=SciPy 0.7.2 release notes |access-date=29 May 2011 |archive-date=4 March 2016 |archive-url=https://web.archive.org/web/20160304052117/http://docs.scipy.org/doc/scipy/reference/release.0.7.2.html |url-status=dead}}</ref><ref name="jmlr">{{cite journal |last1=Pedregosa |first1=Fabian |last2=Varoquaux |first2=Gaël |last3=Gramfort |first3=Alexandre |last4=Michel |first4=Vincent |last5=Thirion |first5=Bertrand |last6=Grisel |first6=Olivier |last7=Blondel |first7=Mathieu |last8=Prettenhofer |first8=Peter |last9=Weiss |first9=Ron |last10=Dubourg |first10=Vincent |last11=Vanderplas |first11=Jake |last12=Passos |first12=Alexandre |last13=Cournapeau |first13=David |title=Scikit-learn: Machine Learning in Python |journal=[[Journal of Machine Learning Research]] |year=2011 |volume=12 |pages=2825–2830 |arxiv=1201.0490|bibcode=2011JMLR...12.2825P }}</ref>
* Some high-traffic websites such as [[Quora]] use Cython.{{better source needed|date=October 2018}}<ref>{{cite web |url=https://www.quora.com/Is-Quora-still-running-on-PyPy/answer/Alex-Yakunin |title=Is Quora still running on PyPy?}}</ref>
Cython's ___domain is not limited to just numerical computing. For example, the
== See also ==
* [[PyPy]]
* [[Numba]]
* [[pybind]]
== References ==
{{reflist|30em}}
== External links ==
* {{Official website}}
* {{
{{Python (programming language)}}
[[Category:Articles with example Python (programming language) code]]
[[Category:Python (programming language)]]
[[Category:Python (programming language) implementations]]
[[Category:Software using the Apache license]]
[[Category:Source-to-source compilers]]
|