请输入您要查询的百科知识:

 

词条 Cython
释义

  1. Design

  2. History

  3. Example

  4. Using in IPython/Jupyter notebook

  5. Uses

  6. See also

  7. References

  8. External links

{{Distinguish|CPython}}{{Use dmy dates|date=February 2014}}{{Infobox software
| name = Cython
| logo = Cython-logo.svg
| developer = Robert Bradshaw, Stefan Behnel, et al.
| released = {{Start date and age|df=yes|2007|07|28}}[1]
| programming language = Python, C
| genre = Programming language
| license = Apache License
| website = {{URL|http://cython.org}}
}}Cython is a programming language that aims to be a superset of the Python programming language, designed to give C-like performance with code that is written mostly in Python with optional additional C-inspired syntax.[2][3]

Cython is a compiled language that is typically used to generate CPython extension modules. Annotated python-like code is compiled to C or C++ then automatically wrapped in interface code, producing extension modules that can be loaded and used by regular Python code using the import statement, but with significantly less computational-overhead at run-time. Cython also facilitates wrapping independent C or C++ code into python-importable modules.

Cython is written in Python and C and works on Windows, macOS, and Linux, producing source files compatible with CPython 2.6, 2.7, and 3.3 through 3.7.

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.

Cython has a foreign function interface for invoking C/C++ 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.[4][5][6][7]

Cython employs:

  • Optimistic optimizations
  • Type inference (optional)
  • Low overhead in control structures
  • Low function call overhead[8][9]

Performance depends both on what C code is generated by Cython and how that code is compiled by the C compiler.[10]

History

Cython is a derivative of the Pyrex language, and supports more features and optimizations than Pyrex.[11][12] Cython was forked from Pyrex in 2007 by developers of the Sage computer algebra package, because they were unhappy with Pyrex's limitations and could not get patches accepted by Pyrex's maintainer Greg Ewing, who envisioned a much smaller scope for his tool than the Sage developers had in mind. They then forked Pyrex as SageX. When they found people were downloading Sage just to get SageX, and developers of other packages (including Stefan Behnel, who maintains the XML library LXML) were also maintaining forks of Pyrex, SageX was split off the Sage project and merged with cython-lxml to become Cython.[13]

Cython files have a .pyx extension. At its most basic, Cython code looks exactly like Python code. However, whereas standard Python is 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): # The argument will be converted to int or raise a TypeError.

    cdef int n, k, i  # These variables are declared with C types.    cdef int p[1000]  # Another C type    result = []  # A Python type    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

Example

A sample hello world program for Cython is more complex than in most languages because it interfaces with the Python C API and the setuptools extension building facility. At least three files are required for a basic project:

  • A setup.py file to invoke the setuptools build process that generates the extension module
  • A main python program to load the extension module
  • Cython source file(s)

The following code listings demonstrate the build and launch process:

  1. hello.pyx - Python Module, this code will be translated to C by Cython.

def say_hello():

  1. launch.py - Python stub loader, loads the module that was made by Cython.
  1. This code is always interpreted, like normal Python.
  2. It is not compiled to C.

import hello

hello.say_hello()

  1. setup.py - unnecessary if not redistributing the code, see below

from setuptools import setup

from Cython.Build import cythonize

setup(name = 'Hello world app',

These commands build and launch the program:

$ python setup.py build_ext --inplace

$ python launch.py

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):

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

which gives a 95 times improvement over the pure-python version. More details on the subject in the official quickstart page.[14]

Uses

Cython is particularly popular among scientific users of Python,[6][15][16] where it has "the perfect audience" according to Python developer Guido van Rossum.[17] Of particular note:

  • The free software SageMath computer algebra system depends on Cython, both for performance and to interface with other libraries.[18]
  • Significant parts of the scientific computing libraries SciPy, pandas and scikit-learn are written in Cython.[19][20]
  • Some high-traffic websites such as Quora use Cython.{{better source needed|date=October 2018}}[21]

Cython's domain is not limited to just numerical computing. For example, the lxml XML toolkit is written mostly in Cython, and like its predecessor Pyrex, Cython is used to provide Python bindings for many C and C++ libraries such as the messaging library ZeroMQ.[22] Cython can also be used to develop parallel programs for multi-core processor machines; this feature makes use of the OpenMP library.

See also

  • PyPy
  • Numba

References

1. ^{{cite web|url=http://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}}
2. ^{{cite web|url=http://docs.cython.org/src/quickstart/overview.html|title=Cython - an overview — Cython 0.19.1 documentation|publisher=Docs.cython.org|accessdate=2013-07-21}}
3. ^{{cite book|last1=Smith|first1=Kurt|title=Cython: A Guide for Python Programmers|date=2015|publisher=O'Reilly Media|isbn=978-1-4919-0155-7|url=http://shop.oreilly.com/product/0636920033431.do}}
4. ^{{cite web|last=Oliphant|first=Travis|date=2011-06-20|url=http://technicaldiscovery.blogspot.com/2011/06/speeding-up-python-numpy-cython-and.html|title=Technical Discovery: Speeding up Python (NumPy, Cython, and Weave)|publisher=Technicaldiscovery.blogspot.com|accessdate=2013-07-21}}
5. ^{{cite journal|last1=Behnel|first1=Stefan|last2=Bradshaw|first2=Robert|last3=Citro|first3=Craig|last4=Dalcin|first4=Lisandro|last5=Seljebotn|first5=Dag Sverre|last6=Smith|first6=Kurt|year=2011 |title=Cython: The Best of Both Worlds |journal=Computing in Science and Engineering |volume=13 |issue=2 |pages=31–39 |doi=10.1109/MCSE.2010.118 |url=http://research.google.com/pubs/pub36727.html}}
6. ^{{cite journal|last=Seljebot|first=Dag Sverre|year=2009 |title=Fast numerical computations with Cython |journal=Proceedings of the 8th Python in Science Conference (SciPy 2009) |pages=15–22 |url= http://conference.scipy.org/proceedings/SciPy2009/paper_2}}
7. ^{{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 | accessdate=14 June 2011 | format=PDF | editor=B. Skallerud; H. I. Andersson}}
8. ^{{cite web|url=http://telecom.inescporto.pt/~gjc/pybindgen-benchmarks/|title=wrapper benchmarks for several Python wrapper generators (except Cython)}}
9. ^{{cite web|url=http://behnel.de/cycppbench/|title=wrapper benchmarks for Cython, Boost.Python and PyBindGen}}
10. ^{{cite web|title=Cython: C-Extensions for Python|url=http://cython.org/index.html|accessdate=22 November 2015}}
11. ^{{cite web|url=https://github.com/cython/cython/wiki/DifferencesFromPyrex|title=Differences between Cython and Pyrex}}
12. ^{{cite web|last=Ewing|first=Greg|url=http://mail.python.org/pipermail/python-dev/2011-March/109642.html|title=Re: VM and Language summit info for those not at Pycon (and those that are!)|type=Message to the electronic mailing-list python-dev|date=21 March 2011|accessdate=5 May 2011}}
13. ^{{cite web|author=Says Sage and Cython developer Robert Bradshaw at the Sage Days 29 conference|url=https://www.youtube.com/watch?v=osjSS2Rrvm0|title=Cython: Past, Present and Future|publisher=youtube.com|date=22 March 2011|accessdate=5 May 2011}}
14. ^{{Cite web|url=https://cython.readthedocs.io/en/latest/src/quickstart/build.html|title=Building Cython code|website=cython.readthedocs.io|access-date=2017-04-24}}
15. ^{{cite web|title=inSCIght: The Scientific Computing Podcast|url=http://inscight.org/2011/03/31/episode_/|type=Episode 6}}
16. ^{{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}}
17. ^{{cite web|author=Guido Van Rossum|url=http://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 python-dev|date=21 March 2011|accessdate=5 May 2011}}
18. ^{{cite book|last1=Erocal|first1=Burcin|last2=Stein|first2=William|year=2010 |title=The Sage Project: Unifying Free Mathematical Software to Create a Viable Alternative to Magma, Maple, Mathematica and MATLAB |journal=Mathematical Software' ICMS 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}}
19. ^{{cite web|url=http://docs.scipy.org/doc/scipy/reference/release.0.7.2.html|title=SciPy 0.7.2 release notes}}
20. ^{{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}}
21. ^{{cite web|url=https://www.quora.com/Is-Quora-still-running-on-PyPy|title=Is Quora still running on PyPy?}}
22. ^{{cite web|url=http://www.zeromq.org/bindings:python|title=ØMQ: Python binding}}

External links

  • {{Official website}}
  • {{github|cython}}
{{Python (programming language)}}

4 : Articles with example Python code|Python (programming language)|Python implementations|Software using the Apache license

随便看

 

开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。

 

Copyright © 2023 OENC.NET All Rights Reserved
京ICP备2021023879号 更新时间:2024/9/28 21:27:22