python文档说,cPickle比Pickle更快的原因是,前者是用C实现的。这究竟是什么意思?
我正在使用Python制作高级数学模块,有些计算需要花费大量时间。这是否意味着如果我的程序在C中实现,它可以更快?
我希望从其他Python程序导入此模块,就像我可以导入cPickle一样。
您能解释一下如何在C中实现Python模块吗?
答案 0 :(得分:15)
你可以编写快速的C代码,然后在你的python脚本中使用它,这样你的程序运行得更快。 [1] http://docs.python.org/extending/index.html#extending-index
一个例子是Numpy,用C(http://numpy.scipy.org/)
编写一个典型的用法是实现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.'
这不是'官方'方式,但可能有用
答案 1 :(得分:8)
如上所述,numpy非常适合矢量计算。 (可能会更好,但是评论说它比没有实际工作的任何东西都要好,绝对是真的。)
不是所有东西都可以很容易地进行矢量化,所以如果你确实有很多函数调用的紧密内部循环(比如一个重度递归算法),你还有几个选项:最受欢迎的是Cython ,它允许您在一种带注释的Python中编写模块和函数,并在需要时获得类似C的速度。
或许你的时间全部由图书馆调用主导,以计算特征值或反转矩阵或评估特殊函数或划分非常大的整数 - 其中许多Sage项目处理得很好,顺便说一句,如果是什么你所做的比纯粹的运算更具数学性 - 在这种情况下,花在Python上的时间可能不重要。这一切都取决于你正在做的数字的细节。
答案 2 :(得分:7)
在python中编写函数时,会创建一个新的函数对象,函数代码被解析并进行字节编译[并保存在“func_code”属性中],因此当您调用该函数时,解释器会读取其字节码并执行它
如果你在C中编写相同的函数,在C / Python API之后使它在python中可用,解释器将创建函数对象,但是这个函数不会有字节码。 当解释器找到对该函数的调用时,它调用真正的C函数,因此它以“机器”速度而不是“python-machine”速度执行。
您可以验证用C:
编写的检查函数>>> map.func_code
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'builtin_function_or_method' object has no attribute 'func_code'
>>> def mymap():pass
...
>>> mymap.func_code
<code object mymap at 0xcfb5b0, file "<stdin>", line 1>
要了解如何编写用于python的C代码,请按照官方网站中的指南进行操作。
无论如何,如果你只是在进行N维数组计算,那么numpy就足够了。
答案 3 :(得分:5)
除了已经提到的Pyrex / Cython之外,你还有其他选择:
Shed Skin:将Python(一个受限制的子集)转换为C ++。可以自动为您生成扩展。你创建了一个扩展程序(假设Linux):
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__
PyPy:一个更快的Python,带有JIT编译器。您可以简单地在其上运行代码而不是CPython。现在只支持Python 2.5,很快就支持2.7。可以为数学繁重的代码提供巨大的加速。安装并运行它(假设Linux 32位):
wget http://pypy.org/download/pypy-1.4.1-linux.tar.bz2
tar -xjf pypy-1.4.1-linux.tar.bz2
sudo ln -s /path/to/pypy-1.4.1-linux/bin/pypy /usr/local/bin
# Then, instead of "python yourprogram.py" you'll just run "pypy yourprogram.py"
Weave:允许你编译write C inline。
编辑:如果您希望我们为您运行这些工具并进行基准测试,只需发布您的代码;)