点选上方关注,All in AI 中国
介绍
如果你曾用Python编写程式码,那么你可能花了更多的时间等待某些程式码块的执行,而不是你想要的。虽然有一些方法可以使您的程式码更有效,但它很可能仍然比C程式码慢。这主要归结为Python是一种动态程式语言,并将许多东西移动到C语言编译期间处理的执行时。
不过,如果你像我一样喜欢用Python编写程式码并且仍想加速你程式码,你可以考虑使用Cython。虽然Cython本身是一种独立的程式语言,但很容易将其整合到例如Jupyter笔记本工作流程。在执行时,Cython将您的Python程式码转换为C,通常会显著加快它的速度。
安装Cython
为了能够使用Cython,您将需要一个C编译器。因此,安装过程会因您当前的操作系统而异。对于Linux,通常存在GNU C编译器(gncc)。对于Mac OS,您可以下载Xcode以获取gncc。如果您应该使用Windows,则安装过程会稍微复杂一些。
一旦你有了你的C编译器,你需要在终端中执行的只有:
pip install Cython
如何使用Cython
演示Cython功能的最简单方法是通过Jupyter笔记本。要在我们的笔记本中使用Cython,我们将使用IPython魔术命令。 Magic命令以百分号开头,并提供一些可以增强工作流程的附加功能。通常,有两种型别的魔术命令:
线条魔法由单个\'%\'表示,并且仅在一行输入上操作单元格魔术用两个\'%\'表示,并在多行输入上操作。让我们开始吧:
首先,为了能够使用Cython,我们必须执行:
%load_ext Cython
现在,每当我们想在程式码单元中执行Cython时,我们必须首先将以下magic命令放入单元格中:
%%cython
一旦你完成了,你就可以开始在Cython中开始编码了。
Cython的速度有多快?
与常规Python程式码相比,Cython的速度有多快取决于程式码本身。例如,如果您执行具有许多变数的计算量很大的循环,Cython将大大优于常规Python程式码。递回函式也会使Cython比Python快得多。
让我们用Fibonacci序列来证明这一点。简单地说,这个算法通过将前两个数字相加来找到下一个数字。以下是Python中的内容:
def fibonacci(n):
if n print("1st fibonacci number = 0")
elif n == 1:
return
elif n == 2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
让Python工作:
如您所见,在序列中找到第39个数字需要13.3秒来计算。此处的挂起时间是指从呼叫该函式开始到结束所用的总时间。
让我们在Cython中定义相同的函式。
这里发生了什么?正如您所看到的,我们正在使用一些单元格魔术,允许我们在此单元格中使用Cython。我将很快解释\'-a\'选项的作用。然后,我们基本上采用与上面相同的程式码,除了现在我们能够使用静态型别宣告并将n定义为整数型别这一事实。
正如您所看到的,通过在magic命令之后新增\'-a\',我们收到了注释,向我们展示了程式码中有多少Python互动。这里的目标是摆脱所有的黄线,让他们有一个白色的背景。在这种情况下,将不会有Python互动,所有程式码都将在C中执行。您还可以单击每行旁边的“+”符号以检视Python程式码的C转换。
这段程式码多快了多少?我们来看看:
在这种情况下,Cython比Python快约6.75倍。这清楚地展示了利用Cython节省时间的能力,它提供了比常规Python程式码最大的改进。
其他选项
如果您已经知道C、Cython还允许访问C程式码,Cython的制造商尚未新增即用型宣告。例如,使用以下程式码,您可以为C函式生成Python包装器,并将其新增到模组dict中。
%%cython
cdef extern from "math.h":
cpdef double sin(double x)
Cython证明了许多其他功能,例如并行性,这些功能在其文件中描述非常简洁。
结论
如果您有时遇到不得不等待太长时间才能执行Python程式码的问题,Cython提供了一种非常整齐且高效的方法来加速您的程式码。最重要的是,它提供了许多进一步优化您的合作的功能。