简介如果你曾经用Python写过代码,那么你等待某些代码块执行的时间可能比你想要的要多。虽然有一些方法可以使您的代码更高效,但它很可能仍然比C代码慢。这主要归结为这样一个事实,即Python是一种动态编程语言,并且将很多东西移动到运行时,这些东西在C编译期间处理。但是,如果你像我一样喜欢用Python编写代码,并且仍想加快代码速度,则可以考虑使用Cython。虽然Cython本身是一种独立的编程语言,但很容易将其集成到例如一个Jupyternotebook工作流程。在执行时,Cython将您的Python代码转换为C,通常会显着加快速度。安装Cython为了能够使用Cython,您需要一个C编译器。因此,安装过程会因您当前的操作系统而异。对于Linux,通常存在GNUC编译器(gncc)。对于MacOS,您可以下载适用于gncc的Xcode。如果您应该使用Windows,则安装过程会稍微复杂一些。拥有C编译器后,您只需在终端中运行即可:pipinstallCython如何使用Cython演示Cython功能的最简单方法是通过Jupyter笔记本。要在我们的笔记本中使用Cython,我们将使用IPython魔术命令。魔术命令以百分号开头,并提供一些可以增强您的工作流程的附加功能。一般来说,魔术命令有两种类型:行魔术由单个'%'表示,并且只对输入单元格的一行进行操作魔术由两个'%'表示,并且对多行输入进行操作。让我们开始吧:首先,为了能够使用Cython,我们必须运行:%load_extCython现在,每当我们想在代码单元中运行Cython时,我们必须首先将以下魔术命令放入单元中:%%cython一旦你完成,您可以开始在Cython中编码。Cython有多快?Cython与常规Python代码相比有多快取决于代码本身。例如,如果您运行具有许多变量的计算密集型循环,Cython将大大优于常规Python代码。递归函数还使Cython比Python快得多。让我们用斐波那契数列来证明这一点。简单地说,该算法通过将前两个数字相加来找到下一个数字。这是它在Python中的样子:defbonacci(n):ifn<0:print("1stfibonaccinumber=0")elifn==1:returnelifn==2:return1else:returnfibonacci(n-1)+fibonacci(n-2)让Python工作:如您所见,找到序列中的第39个数字需要13.3秒的计算时间。这里的挂起时间是指函数从开始到结束的总时间。让我们在Cython中定义相同的函数。这里发生了什么?如您所见,我们正在使用一些允许我们在此单元格中使用Cython的单元格魔法。我将很快解释“-a”选项的作用。然后我们基本上采用与上面相同的代码,除了现在我们能够使用静态类型声明并将n定义为整数类型。如您所见,通过在魔术命令后添加“-a”,我们收到的评论向我们展示了代码中有多少Python交互。这里的目标是摆脱所有的黄线,使它们具有白色背景。在这种情况下,不会有Python交互,所有代码都将在C中运行。您还可以单击每行旁边的“+”号来查看Python代码的C翻译。这段代码快多少?让我们看看:在这种情况下,Cython比Python快大约6.75倍。这清楚地展示了使用Cython的省时功能,它提供了对常规Python代码的最大改进。其他选项如果您已经了解C,Cython还允许访问C代码,Cython的制造商尚未添加现成的声明。例如,使用以下代码,您可以为C函数生成Python包装器并将其添加到模块字典中。%%cythoncdefexternfrom"math.h":cpdefdoublesin(doublex)Cython证明了许多其他特性,例如并行性,这些特性在其文档中进行了非常简洁的描述。结论如果您有时遇到必须等待太长时间才能执行Python代码的问题,Cython提供了一种非常简洁有效的方法来加速您的代码。最重要的是,它提供了许多功能来进一步优化您的协作。
