如何用纯汇编编写Python扩展,效率如何?
我对Python
有中等水平的业余技能,对asm
是个初学者,而且对C
语言没有任何了解。
我知道,Python
的C
扩展必须遵循特定的接口才能正常工作。
那么,是否可以用纯Assembly
语言编写Python
扩展,只要遵循正确的接口并实现完整的功能呢?第二个问题是,如果做到这一点,它的效率会足够高吗?
在网上搜索时,我没有找到任何相关的代码示例、文章或解决方案。
而且,这不是关于在Python
中运行asm
代码的问题,所以它不是Stack Overflow上其他主题的重复。
3 个回答
你可以把汇编代码写成嵌入式汇编,放在你的C扩展里面,这样做是为了提高效率……
茶壶。
效率并不是由你选择的编程语言决定的,而是看你实现得有多好,设计得有多合理。
理论上来说 - 这是可能的。
但在实际操作中 - 这样做是非常不实际的。
实际上,只有极少数情况下,使用汇编语言比使用C语言更有道理,即使你遇到这样的情况,通常你也不太可能在那时使用Python。
另外要注意的是,编译器可以把C代码优化成非常高效的汇编代码。实际上,你手动写的汇编代码比编译器生成的代码更高效的可能性非常小,除非你有非常强的汇编技能,或者你一辈子都在写汇编代码。
怎么做:
我不确定你能不能完全用汇编语言来实现,但可以这样做:如果你在C语言中创建一个“代理类”(我们就这么称呼它),这个类调用汇编函数,然后用C语言的约定来编写汇编代码,那么只需编译汇编代码:
nasm -felf64 -g -F dwarf assembly_function.asm
接着,使用一个包含以下内容的setup.py文件:
from distutils.core import setup, Extension
setup(name='assembly_include_name', version='1.0', ext_modules=[Extension('assembly_include_name', ['c_assembly_proxy.c'],extra_objects=["assembly_function.o"])])
你就能实现你想要的功能。注意,你需要在扩展构造函数中添加“extra_objects”这个参数,这样才能告诉Python去链接汇编代码,否则它会崩溃,并提示找不到函数名。
为什么要这么做:
如果你想使用SSE指令(比如SSE2、SSE3等),不管编译器做了什么优化。
扩展API:https://docs.python.org/2/extending/extending.html
disutils.core参考:https://docs.python.org/2/distutils/apiref.html?highlight=distutils.core#module-distutils.core