我正在尝试使用Ctypes加速集成(scipy.integrate.quad)。我从未使用过C并且不了解Ctypes文档。有人可以使用尽可能少的计算术语来基本解释Ctypes实际上在做什么。基本上请像我5岁那样解释它!
由于
答案 0 :(得分:0)
计算机通过以下非常简单的步骤运行任何程序,称为机器代码或本机代码。在那个级别,任何东西都是少数几个宽度,并且有数百万个内存槽来存储它们。在编写程序时,通常需要更高级别的抽象,允许我们命名变量和子程序,跟踪什么记忆保持什么价值,等等。本机代码本身不会泄露该信息,但存储的程序文件(无论是库还是可执行文件)通常都有一些线索,例如子例程名称。 C源代码在声明中提供此信息,并且一些库(如SciPy)具有包装器以保存另一层的信息,在本例中为Python。与C变量不同,Python对象始终保存有关其类型的信息。 Ctypes允许查找名称并描述丢失的类型信息,因此可以从Python访问本机变量和子程序。在scipy.integrate.quad示例中,Ctypes用于从名为func的本机子例程创建Python函数对象。
>>> import ctypes
>>> lib = ctypes.CDLL('/home/.../testlib.*') #use absolute path
>>> lib.func.restype = ctypes.c_double
>>> lib.func.argtypes = (ctypes.c_int,ctypes.c_double)
在C语言中,此函数声明为extern double func(int, double);
。一般来说,本机例程比Python更快,因为Python必须弄清楚它处理的对象如何处理每个操作,而这些信息在C中是静态确定的。只需及时编译器即可达到中间位置,其中PyPy就是一个很好的例子。