关于 Cython
Cython 是一个针对 Python 编程语言和扩展的 Cython 编程语言(基于 Pyrex)的 优化静态编译器。它使编写 Python 的 C 扩展变得像 Python 本身一样容易。
Cython 为您提供了 Python 和 C 的强大功能,让您
Cython 语言是 Python 语言的超集,它还支持调用 C 函数并在变量和类属性上声明 C 类型。这使得编译器能够从 Cython 代码生成非常 高效的 C 代码。C 代码 只生成一次,然后使用 CPython 2.6、2.7(2.4+ 使用 Cython 0.20.x)以及 3.5 及更高版本中的所有主要 C/C++ 编译器进行编译。我们定期针对所有支持的 CPython 版本及其最新的开发分支运行集成测试,以确保生成的代码保持广泛的兼容性,并很好地适应每个版本。 PyPy 支持正在进行中(双方都在进行),自 Cython 0.17 以来被认为 基本可用。始终建议在此处使用最新的 PyPy 版本。
所有这些都使 Cython 成为 包装外部 C 库、嵌入 CPython 到现有应用程序以及用于 快速 C 模块(加速 Python 代码执行)的理想语言。
🌷️ 您的捐赠可以帮助 Cython 项目! 🌷️️
让 Cython 成为您伟大的编程语言,并使其与 Python 生态系统以及其多元用户群不断变化的需求保持同步,需要大量的时间和投入。为了支持 Cython 语言和编译器的维护和未来发展,您可以通过以下方式赞助 Stefan Behnel 的工作:
请注意,PayPal 对小型非欧元支付收取 5-15% 的费用,这是您支付的费用,但没有帮助我们。请考虑改为注册 GitHub 赞助商订阅。
文档
外部资源
如果您还有其他问题,请随时发送电子邮件到 cython 用户邮件列表。核心开发的各个方面在 cython 核心开发人员 邮件列表中进行讨论。如果您不确定使用哪个列表,cython 用户列表可能是正确的选择,它拥有更大的受众。在 freenode IRC 服务器上还有一个 #cython 频道,用于与 Cython 相关的聊天。
下载
Cython 可以在 **开源** 的 Apache 许可证 下免费使用。
Cython 的 **最新版本** 是 3.0.10(发布于 2024-03-30)。Cython 可从 PyPI **软件包索引库** 获取。
人员
**核心开发者**: Stefan Behnel,Robert Bradshaw,David Woods,Matúš Valo,Lisandro Dalcín
**贡献者**: Marc Abramowitz, Wichert Akkerman, Martin Albrecht, Peter Alexander, Francesc Alted, Ivan Andrus, Arfrever Frehtes Taifersar Arahesis, Philip Austin, Josh Ayers, Haoyu Bai, Grant Baillie, Nicolas Barbey, Gustavo Barbieri, David Barnett, Andrea Bedini, Brian Bishop, Chuck Blake, Alexey Borzenkov, Georg Brandl, Nils Braun, Erik Bray, Matthew Brett, Nils Bruin, Matthias Bussonnier, Lars Buitinck, Vladimir Cerny, Ondrej Certik, Shalabh Chaturvedi, Eric Chlebek, David Christenson, Craig Citro, Timothy Clemans, Bryan Cole, Favian Contreras, Dave Cournapeau, Andreas van Cranenburgh, Antonio Cuni, Armon Dadgar, Julien Danjou, Jeroen Demeyer, Eric Dill, Nicolas Dumazet, Ali Ebrahim, John Ehresman, Michael Enßlin, Jason Evans, Isuru Fernando, Eric Firing, Mark Florisson, Claudio Freire, Danilo Freitas, Bradley Froehle, Gary Furnish, Syam Gadde, Martín Gaitán, Gabriel Gellner, Christoph Gohlke, Evgeny Golyshev, Brian Granger, Olivier Grisel, Christoph Groth, Jason Grout, Romain Guillebert, Adrien Guinet, Valentin Haenel, Yaroslav Halchenko, Richard Hansen, Kay Hayen, Ian Henriksen, Philip Herron, Magnus Lie Hetland, David Hirschfeld, Jiajun Huang, Thomas Hunger, Eric Huss, Naoki Inada, Joe Jevnik, Omer Katz, Karl Kempe, Rafe Kettler, Jerome Kieffer, W. Trevor King, Jim Kleckner, Ronan Lamy, Torsten Landschoff, Chris Lasher, Sergei Lebedev, Antony Lee, Björn Linse, Mark Lodato, Thomas Lotze, Vitja Makarov, Angus McMorland, David McNab, Jason Madden, Syrtis Major, Yesudeep Mangalapilly, Tadeu Manoel, Vasil Manolov, Gabriel de Marmiesse, Sturla Molden, Mansour Moufid, Nikita Nemkin, David Nogueira, Andrew Ohana, Jay Oster, Olivier Parcollet, Brent Pedersen, Mark Peek, Chris Perkins, Gabriel Pettier, Emmanuel Gil Peyrot, Matti Picus, Antoine Pitrou, Andrey Plotnikov, Paul Prescod, Prabhu Ramachandran, Jeff Ramnani, Holger Rapp, Nikolaus Rath, Peinthor Rene, Armin Rigo, Joon Ro, Fabian Rost, Ralf Schmitt, Michael Seifert, Dag Sverre Seljebotn. Corbin Simpson, Kirill Smelkov, Ivan Smirnov, Kurt Smith, Nathaniel Smith, William Stein, Andrew Straw, Boxiang Sun, Arfrever Taifersar Arahesis, Dimitri Tcaciuc, Gregor Thalhammer, Kevin R. Thornton, Peter Todd, Erik Tollerud, David Vierra, Petr Viktorin, Mathieu Virbel, Pauli Virtanen, Jakub Wilk, Carl Witty, Felix Wu, Yury Zaytsev, Jelle Zijlstra.
**资金贡献**: Google 和 Enthought 为 Dag Seljebotn 提供资金,以大幅改进 Cython 与 NumPy 的集成。Kurt Smith 和 Danilo Freitas 通过 Google Summer of Code 项目获得资金,分别致力于改进 Fortran 和 C++ 支持,2010 年 Haoyu Bai 获得资金致力于 Python 3 兼容性。
**特别感谢**: Greg Ewing 发明并开发了 Cython 的前身 Pyrex,并为语言设计决策提供了宝贵的意见。
有用链接
用户对 Cython 的评价
»你会期望很多组织和个人会喜欢一种像 Python 一样高级的语言,但速度几乎和 C 一样快,而且接近底层。
再加上它能够无缝地与你现有的 C/++ 代码库和 Python 代码库集成,轻松地将非常高级的抽象与非常底层的机器访问混合在一起…… 显然是赢家。« → Dun Peal 在 c.l.py 上
»你们太棒了!在 scikit-learn 中,我们很早就决定使用 Cython,而不是 C 或 C++。这个决定是一个明显的胜利,因为代码的可维护性要高得多。我们不得不让新的贡献者相信 Cython 对他们来说更好,但代码的可读性和支持多个 Python 版本的能力是值得的。« → Gaël Varoquaux
»最大的惊喜(当然,这也是 Cython 的卖点)是高级代码和低级代码之间的接口变得多么简单,以及它非常健壮的事实。
看到有几个活跃的项目试图加速 Python 真是令人兴奋。Cython 的好处在于它不会给你“C 速度的一半”或“也许在 3 年后接近 C 的速度”——它提供了真正的速度,-O3 C,而且现在就可以使用。« → Fredrik Johansson
»SciPy 大约由 50% 的 Python、25% 的 Fortran、20% 的 C、3% 的 Cython 和 2% 的 C++ 组成……SciPy 中次要编程语言的分布是权衡的结果,一方面是寻求一种与 Python 良好交互的强大、性能增强型语言(即 Cython),另一方面是使用经过数十年验证的可靠且高效的语言(及其库)。
对于实现新功能,Python 仍然是首选语言。如果 Python 性能成为问题,我们更倾向于使用 Cython,其次是 C、C++ 或 Fortran(按此顺序)。这样做的主要原因是可维护性:Cython 的抽象级别最高,大多数 Python 开发人员都能理解它。C 也广为人知,并且对于当前的核心开发团队来说,比 C++ 和 Fortran(尤其是 Fortran)更容易管理。« → Pauli Virtanen 等人,SciPy
»更不用说生成的 C 代码经常使用一些手动编写起来过于繁琐或晦涩的性能技巧,这在一定程度上是受科学计算不断发展的推动。并且,在所有这些过程中,Cython 代码都保持着与 Python 本身的高度集成,甚至包括堆栈跟踪和行号。
PayPal 通过 gevent、lxml 和 NumPy 等高性能 Cython 用户,从他们的努力中获益匪浅。虽然我们第一次尝试使用 Cython 在 2011 年没有成功,但从 2015 年开始,所有原生扩展都使用 Cython 编写或重写。« → Mahmoud Hashemi
»Cython 生成的二进制文件与 C++、Go 和 Rust 生成的二进制文件非常相似。现在,借助 GitHub Actions,可以免费为开源项目自动执行跨平台构建和发布流程。这是一个巨大的机会,可以使 Python 生态系统通过一个简单的拉取请求提升 20-50% 的速度。« → Grant Jenks
»我老实说再也不想写 C 代码了。Cython 为我提供了 Python 的所有表达能力,以及 C 的所有性能和接近底层的强大功能。我一直用它来实现高性能图遍历和路由算法,以及与 C/C++ 库进行交互,它极大地提高了我的生产力。« → Andrew Tipton
»一个普遍的经验法则是,你的程序 80% 的时间都在运行 20% 的代码。因此,高效编码的一个好策略是编写所有代码,分析代码,并优化需要优化的部分。Python 的分析器非常棒,而 Cython 让你能够以最小的努力完成最后一步。« → Hoyt Koepke
»问题是,在自动生成的代码中,错误的程度如何,生成器中的错误程度如何。我第一次这样做时,从 SWIG 和 Cython 生成的代码中都得到了很多来自工具的警告……
基本上,我发现 Cython 发出的所有警告都是误报,并且是我的检查工具(CPyChecker)中的错误。« → David Malcolm
»基本上,Cython 的速度是 Boost.Python 的 7 倍,这让我感到震惊。« → Chris Chou
»使用 Cython 让你可以只专注于加速需要改进的代码部分,而且无需进行太多修改。这与完全放弃所有代码并用另一种语言重新实现完全不同。它也只需要你学习很少的东西。你还可以保留 Python 语法的优点,而 Python 编码人员可能已经开始欣赏这种语法。« → Craig Macomber
»如果你有一段需要快速运行的 Python 代码,我建议你立即使用 Cython。这意味着我可以同时利用 Python 的美妙之处和 C 的速度,这简直是天作之合。« → Stavros
»从头开始编写完整的 CPython 模块可能会比 Cython 提供更好的性能,前提是你了解其怪癖并有纪律。但对于那些不熟悉 CPython C 模块的人来说,Cython 就是救星。
最终,有 5 种常用的方法(CPython [C-API]、Boost::Python、SWIG、Cython、ctypes)可以将 C 集成到 Python 中,现在如果你有这种需求,不尝试一下 Cython 就太疯狂了。对于熟悉 C 和 Python 的任何人来说,它都很容易学习。« → ashika
»我喜欢 Cython 代码的地方在于,我使用 Python 列表来管理 Vortex 对象。这表明我们可以使用普通的 Python 容器来管理对象。这非常方便。[...]
显然,如果你从头开始构建代码并且需要速度,Cython 是一个极好的选择。为此,我必须对 Cython 和 Pyrex 的开发者表示衷心的感谢。« → Prabhu Ramachandran
»我写了一个脚本,用 Numpy 数组在 Python 中计算距离矩阵 (O^2),并在 Cython 中写了相同的脚本。我花了 10 分钟才弄明白 Cython 的工作原理,结果速度提高了 550 倍!!!太棒了!« → kfrancoi
»我想报告一个成功的 Cython 项目。成功是指它比我之前所有代码都快,主要是因为速度几乎与核心数量成线性关系。此外,代码更短,更易于阅读和维护。[...]
如果没有 Cython,要做到如此快速、简洁、可读和可维护将非常困难。« → Alex van Houten
»在工作中,我们开始使用 Cython,取得了巨大的成功。我们将一个特定的 Perl 脚本重写为 Cython,速度提高了 600%。作为一名 Perl 爱好者,这令人印象深刻。我们仍然可以享受 Python 的所有优势,例如快速开发和简洁的面向对象设计模式,但速度却达到了 C 的水平。« → Wim Kerkhoff
»我之所以对 Cython 感兴趣,是因为我在使用 scipy.integrate.odeint 求解微分方程时,遇到了多变量优化计算时间过长的问题。只需将包含微分方程的类替换为 Cython 版本,计算时间就减少了 5 倍。对于一个周日下午的工作来说,这还不错。« → Korbinin
»令我惊讶的是,在 Windows 和 Linux 下运行它都非常简单。我不必处理 make 文件或配置编译器。Cython 与 NumPy 和 SciPy 集成良好。这大大扩展了你可以用 Python 完成的编程任务。« → Sami Badawi
»这就是 Scipy 的人一直强调 Cython 的原因——它正在迅速成为(或者已经成为)将遗留库暴露给 Python 的通用语言。他们的用户群拥有大量的遗留代码或外部库需要进行接口,而 Python 在该领域取得如此成功的主要原因是 Numpy 使得该接口的数据部分变得容易。Cython 也使代码部分变得非常轻松。« → Peter Z. Wang
»添加了一个可选步骤,使用 Cython 编译 fastavro。仅仅这样做,没有使用任何特定于 Cython 的代码,处理 10K 条记录的时间就从 2.9 秒减少到了 1.7 秒。对于这么小的工作量来说,还不错。« → Miki Tebeka
»fastavro 编译 Python 代码,没有任何特定于 Cython 的代码。这样,在没有编译器的机器上,用户仍然可以使用 fastavro。
最终结果是一个比 Java 更快地读取 Avro 的包,并且支持 Python 2 和 Python 3。使用 Cython 和一些工作,[这] 在没有太多努力的情况下就实现了。« → Miki Tebeka
»... 绑定需要重写,主要是因为当前的绑定是直接用 C++ 编写的,维护起来很麻烦。这个新的绑定是用 Cython 编写的。« → Bastien Léonard
»通过 Cython 生成代码可以生成更小、更易于维护的绑定,包括提高与所有支持的 Python 版本的兼容性,而不会给 NEST 开发人员带来额外的负担。«
这种方法使代码占用空间减少了约 50%,并且显著提高了与 Python 绑定相关的代码的凝聚力:以前涉及七个核心文件和 22 个附加文件,而新方法只需要两个核心文件。新实现还消除了对 NumPy 的编译时依赖,并通过降低复杂性和提高代码的可理解性,提供了许多额外的可维护性优势。构建系统的重写也使代码减少了 50%,并解决了其可用性和鲁棒性方面的多个问题。 «
» 总之,我们希望通过更广泛地使用 Cython,神经科学软件开发人员能够将他们的创造性精力集中在改进算法和实现新功能上,而不是为偿还不断累积的技术债务而努力。 « → Yury V. Zaytsev 和 Abigail Morrison
» Cython 版本大约花了 30 分钟编写,它的运行速度与 C 代码一样快——因为,为什么不呢?它实际上是 C 代码,只是有一些语法糖。而且你甚至不必学习或考虑一个陌生的、复杂的 C API……你只需要编写 C 代码。或者 C++——尽管这有点笨拙。Cython 版本和 C 版本都比使用 Numpy 数组的纯 Python 版本快约 70 倍。 « → Matthew Honnibal
» 我喜欢这个项目。这是一个为原生库编写 Python 绑定或加速计算密集型代码的绝佳方法,而无需自己编写 C 代码。 « → schmichael
» 我经常使用 pyrex/cython 来绑定到库——用 Python 编码要快得多。它是一个巨大的福音。在使用 swig、手动编写包装器和 pyrex 之前,我可以说我更喜欢 cython。感谢你们的辛勤工作。 « → jnazario
» 我不擅长 C,所以我的研究主要使用纯 Python。但是,现在处理 1000 多个分子的集群,我的代码出现了巨大的瓶颈。
使用 cython 后,它从每小时运行一次计算变成了每秒运行一次,真是太棒了…… « → fishtickler
» Cython 可以让你免受 [C 语言中] 许多陷阱的困扰。最糟糕的情况通常是性能没有提升(在这种情况下,cython -a 是你的朋友)。要榨取所有可能的性能,你需要对 C 语言有一定的了解——但你不需要精通它就能做得很好。 « → lmcinnes
» [spaCy] 是用干净但高效的 Cython 代码编写的,这使我们能够在一个代码库中管理低级细节和高级 Python API。 « → Matthew Honnibal
» [uvloop] 是用 Cython 编写的,顺便说一句,Cython 太棒了。不幸的是,它没有那么广泛使用,我认为人们低估了你在 Cython 中能做的事情。本质上,它是 Python 语言的超集,你可以严格地对其进行类型化,它将编译成 C 代码,并且你会拥有 C 代码的速度。你可以轻松地实现它,并且语法更类似于 Python。一定要尝试一下 Cython。 « → Yury Selivanov (video@22:50)
» 300,000 req/sec 的数字与 Go 的内置 Web 服务器相当(我是在几年前进行的一次粗略测试的基础上说的)。考虑到 Go 的设计就是为了做这件事,这真的令人印象深刻。我赞赏你选择使用 Cython。 « → beertown
» Cython 是 Python 最不为人知的秘密之一。它从一个方向扩展了 Python,解决了该语言和平台的许多缺点。 « → Ulaş Türkmen
更多 ...更少 ...