wget http://shedskin.googlecode.com/files/shedskin-0.7.tgz
tar -xzf shedskin-0.7.tgz
# On your code folder:
PYTHONPATH=/path/to/shedskin-0.7 python shedskin -e yourmodule.py
# The above generates a Makefile and a yourmodule.h/.cpp pair
make
# Now you can "import yourmodule" from Python and check it's from the .so by "print yourmodule.__file__
5条答案
按热度按时间jmp7cifd1#
您可以编写快速的C代码,然后在Python脚本中使用它,这样您的程序将运行得更快。[1] www.example.com
一个例子是用C(https://numpy.org/)编写的Numpy。
典型的用途是用C实现瓶颈(当然,也可以使用用C编写的库;)),由于它的速度,并使用python的其余代码
[1]顺便说一下,这就是为什么cPickle比pickle快
编辑:
看看Pyrex:http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/About.html
Pyrex是专门为编写Python扩展模块而设计的语言。它的设计是为了弥合Python的高级易用世界和C的低级混乱世界之间差距。”
这不是'官方'的方式,但它可能是有用的
xpcnnkqh2#
如上所述,numpy非常适合向量计算。(还可以更好,但评论说它比你不用实际工作就能写出来的任何东西都要好,这绝对是真的。)
然而,并不是所有的东西都可以很容易地向量化,所以如果你有很多函数调用的紧密内部循环(比如一个严重的递归算法),你仍然有几个选择:可能最流行的是Cython,它允许你用一种带注解的Python编写模块和函数,并在需要时获得类似C的速度。
或者你的时间可能都被计算特征值或求逆矩阵或计算特殊函数或划分非常大的整数的库调用所支配-顺便说一句,如果你所做的更多的是数学而不是纯粹的运算,其中许多Sage项目处理得非常好-在这种情况下,花在Python上的时间可能根本不重要。这完全取决于你所做的数字运算的细节。
flmtquvp3#
当你在Python中编写一个函数时,会创建一个新的函数对象,函数代码会被解析和字节编译[并保存在“func_code”属性中],所以当你调用这个函数时,解释器会读取它的字节码并执行它。
如果你用C语言编写相同的函数,遵循C/Python API使其在Python中可用,解释器将创建函数对象,但这个函数不会有字节码。当解释器找到对该函数的调用时,它调用真实的的C函数,因此它以“机器”速度执行,而不是以“Python机器”速度执行。
你可以通过检查用C编写的函数来验证这一点:
要了解如何为python编写C代码,请遵循官方网站中的指南。
无论如何,如果你只是在做N维数组计算,numpy应该足够了。
ipakzgxi4#
除了已经提到的Pyrex/Cython之外,你还有其他的选择:
Shed Skin:将Python(受限子集)转换为C++。可以自动为您生成一个扩展。您可以创建一个扩展来执行此操作(假设是Linux):
PyPy:一个更快的Python,带有JIT编译器。你可以简单地在上面运行你的代码,而不是CPython。仅支持Python 2。5现在,2.7支持很快。可以在计算量很大的代码上给予巨大的加速。要安装并运行它(假设Linux 32位):
Weave:允许你编译write C inline。
编辑:如果你想让我们为你运行这些工具和基准测试,只需发布你的代码;)
6ojccjat5#
我很晚了,但如果有人需要在2023年知道这一点,这里是解决方案:
1.将其编译为一个Object文件(如果使用gcc,请使用
gcc --Wall --save-temps library.c
)。o文件在同一目录中。1.转换对象文件(。o)到共享对象(.所以)与
gcc -shared library.o -fPIC
1.打开Python项目,导入ctypes模块。
1.型号
clibrary = ctypes.CDLL("path\to\file.so")
1.你完了!现在输入
clibrary.function(args)
,你在Python中调用了一个C函数!