如何用纯汇编编写Python扩展,效率如何?

1 投票
3 回答
1716 浏览
提问于 2025-04-17 13:49

我对Python有中等水平的业余技能,对asm是个初学者,而且对C语言没有任何了解。

我知道,PythonC扩展必须遵循特定的接口才能正常工作。

那么,是否可以用纯Assembly语言编写Python扩展,只要遵循正确的接口并实现完整的功能呢?第二个问题是,如果做到这一点,它的效率会足够高吗?

在网上搜索时,我没有找到任何相关的代码示例、文章或解决方案。

而且,这不是关于在Python中运行asm代码的问题,所以它不是Stack Overflow上其他主题的重复。

3 个回答

2

你可以把汇编代码写成嵌入式汇编,放在你的C扩展里面,这样做是为了提高效率……

茶壶。

效率并不是由你选择的编程语言决定的,而是看你实现得有多好,设计得有多合理。

6

理论上来说 - 这是可能的

但在实际操作中 - 这样做是非常不实际的

实际上,只有极少数情况下,使用汇编语言比使用C语言更有道理,即使你遇到这样的情况,通常你也不太可能在那时使用Python。

另外要注意的是,编译器可以把C代码优化成非常高效的汇编代码实际上,你手动写的汇编代码比编译器生成的代码更高效的可能性非常小除非你有非常强的汇编技能,或者你一辈子都在写汇编代码。

1

怎么做:

我不确定你能不能完全用汇编语言来实现,但可以这样做:如果你在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

撰写回答