如何用C语言优化Python代码
如何用C语言优化Python代码
这篇“如何用C语言优化Python代码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用C语言优化Python代码”文章吧。
Cython 创建的 C 模块可以加速 Python 代码的执行,这对使用效率不高的解释型语言编写的复杂应用是很重要的。
Cython 是 Python 编程语言的编译器,旨在优化性能并形成一个扩展的 Cython 编程语言。作为 Python 的扩展,Cython也是 Python 语言的超集,它支持调用 C 函数和在变量和类属性上声明 C 类型。这使得包装外部 C 库、将 C 嵌入现有应用程序或者为 Python 编写像 Python 一样简单的 C 语言扩展语法变得容易。
Cython 一般用于创建 C 模块来加速 Python 代码的执行。这在使用解释型语言编写的效率不高的复杂应用中非常重要。
安装 Cython
你可以在 Linux、BSD、Windows 或 macOS 上安装 Cython 来使用 Python:
$python-mpipinstallCython
安装好后,就可以使用它了。
将 Python 转换成 C
使用 Cython 的一个好的方式是从一个简单的 “hello world” 开始。这虽然不是展示 Cython 优点的最好方式,但是它展示了使用 Cython 时发生的情况。
首先,创建一个简单的 Python 脚本,文件命名为hello.pyx
(.pyx
扩展名并不神奇,从技术上它可以是任何东西,但它是 Cython 的默认扩展名):
print("helloworld")
接下来,创建一个 Python 设置脚本。一个像 Python 的 makefile 一样的setup.py
,Cython 可以使用它来处理你的 Python 代码:
fromsetuptoolsimportsetupfromCython.Buildimportcythonizesetup(ext_modules=cythonize("hello.pyx"))
最后,使用 Cython 将你的 Python 脚本转换为 C 代码:
$pythonsetup.pybuild_ext--inplace
你可以在你的工程目录中看到结果。Cython 的cythonize
模块将hello.pyx
转换成一个hello.c
文件和一个.so
库。这些 C 代码有 2648 行,所以它比一个一行的hello.pyx
源码的文本要多很多。.so
库也比它的源码大 2000 倍(即 54000 字节和 20 字节相比)。然后,Python 需要运行单个 Python 脚本,所以有很多代码支持这个只有一行的hello.pyx
文件。
要使用 Python 的 “hello world” 脚本的 C 代码版本,请打开一个 Python 提示符并导入你创建的新hello
模块:
>>>importhellohelloworld
将 C 代码集成到 Python 中
测试计算能力的一个很好的通用测试是计算质数。质数是一个比 1 大的正数,且它只有被 1 或它自己除后才会产生正整数。虽然理论很简单,但是随着数的变大,计算需求也会增加。在纯 Python 中,可以用 10 行以内的代码完成质数的计算。
importsysnumber=int(sys.argv[1])ifnotnumber<=1:foriinrange(2,number):if(number%i)==0:print("Notprime")breakelse:print("Integermustbegreaterthan1")
这个脚本在成功的时候是不会提醒的,如果这个数不是质数,则返回一条信息:
$./prime.py3$./prime.py4Notprime.
将这些转换为 Cython 需要一些工作,一部分是为了使代码适合用作库,另一部分是为了提高性能。
脚本和库
许多用户将 Python 当作一种脚本语言来学习:你告诉 Python 想让它执行的步骤,然后它来做。随着你对 Python(以及一般的开源编程)的了解越多,你可以了解到许多强大的代码都存在于其他应用程序可以利用的库中。你的代码越不具有针对性,程序员(包括你)就越可能将其重用于其他的应用程序。将计算和工作流解耦可能需要更多的工作,但最终这通常是值得的。
在这个简单的质数计算的例子中,将其转换成 Cython,首先是一个设置脚本:
fromsetuptoolsimportsetupfromCython.Buildimportcythonizesetup(ext_modules=cythonize("prime.py"))
将你的脚本转换成 C:
$pythonsetup.pybuild_ext--inplace
到目前为止,一切似乎都工作的很好,但是当你试图导入并使用新模块时,你会看到一个错误:
>>>importprimeTraceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"prime.py",line2,ininitprimenumber=sys.argv[1]IndexError:listindexoutofrange
这个问题是 Python 脚本希望从一个终端运行,其中参数(在这个例子中是要测试是否为质数的整数)是一样的。你需要修改你的脚本,使它可以作为一个库来使用。
写一个库
库不使用系统参数,而是接受其他代码的参数。对于用户输入,与其使用sys.argv
,不如将你的代码封装成一个函数来接收一个叫number
(或者num
,或者任何你喜欢的变量名)的参数:
defcalculate(number):ifnotnumber<=1:foriinrange(2,number):if(number%i)==0:print("Notprime")breakelse:print("Integermustbegreaterthan1")
这确实使你的脚本有些难以测试,因为当你在 Python 中运行代码时,calculate
函数永远不会被执行。但是,Python 编程人员已经为这个问题设计了一个通用、还算直观的解决方案。当 Python 解释器执行一个 Python 脚本时,有一个叫__name__
的特殊变量,这个变量被设置为__main__
,但是当它被作为模块导入的时候,__name__
被设置为模块的名字。利用这点,你可以写一个既是 Python 模块又是有效 Python 脚本的库:
importsysdefcalculate(number):ifnotnumber<=1:foriinrange(2,number):if(number%i)==0:print("Notprime")breakelse:print("Integermustbegreaterthan1")if__name__=="__main__":number=sys.argv[1]calculate(int(number))
现在你可以用一个命令来运行代码了:
$python./prime.py4Notaprime
你可以将它转换为 Cython 来用作一个模块:
>>>importprime>>>prime.calculate(4)Notprime
C Python
用 Cython 将纯 Python 的代码转换为 C 代码是有用的。这篇文章描述了如何做,然而,Cython 还有功能可以帮助你在转换之前优化你的代码,分析你的代码来找到 Cython 什么时候与 C 进行交互,以及更多。如果你正在用 Python,但是你希望用 C 代码改进你的代码,或者进一步理解库是如何提供比脚本更好的扩展性的,或者你只是好奇 Python 和 C 是如何协作的,那么就开始使用 Cython 吧。
以上就是关于“如何用C语言优化Python代码”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
C/C++如何获取CAN信号