1

我有中等的业余技能,Python我是初学者,asm对语言一无所知C

我知道 python C-extensions 必须遵循特定的接口才能正常工作。

这是否可以Assembly用正确的接口和完整的功能编写纯 python 扩展?第二个问题是,如果做得对,它是否足够有效?

在谷歌搜索时,我没有找到任何关于这个问题的代码示例或一些文章或解决方案。

不是关于asm从内部运行代码的问题,Python因此它与 SO 上的主题不重复。

4

3 回答 3

6

理论上——这是可能的

在实践中——这样做是非常不切实际的

在极少数情况下可以合理地使用汇编而不是 C,即使您遇到这种情况,在这种情况下您也不太可能使用 Python。

另请注意,编译器可以将 C 代码优化为极其高效的汇编事实上,你几乎不可能手写汇编,编译器输出的效率会更高除非你有非常强大的汇编技能,或者你一生都在写汇编。

于 2013-01-27T10:57:45.673 回答
2

你可以将你的 asm 写为你的 c 扩展内的内联 asm,至于效率......

茶壶。

效率不是通过语言的选择来衡量的,而是通过实现的好坏和设计的好坏来衡量的。

于 2013-01-27T10:58:10.177 回答
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"])])

你将能够做你想做的事。请注意,您必须在 Extension 构造函数中添加参数“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

于 2015-05-26T14:30:24.790 回答