Python Ctypes-基本解释

Python Ctypes-基本解释,python,integration,ctypes,Python,Integration,Ctypes,我正在尝试使用Ctypes加速集成(scipy.integrate.quad)。我从未使用过C,也不理解Ctypes文档。有人能用尽可能少的计算术语对Ctypes实际做些什么给出一个基本的解释吗。基本上,请解释一下,就像我5岁一样 谢谢计算机通过执行非常简单的步骤(称为机器代码或本机代码)来运行任何程序。在这个级别上,任何东西都是一些宽度,有数百万个内存插槽可以存储它们。在编写程序时,通常需要更高级别的抽象,允许我们命名变量和子例程,跟踪内存中包含的值,等等。本机代码本身并没有透露这些信息,但存

我正在尝试使用Ctypes加速集成(scipy.integrate.quad)。我从未使用过C,也不理解Ctypes文档。有人能用尽可能少的计算术语对Ctypes实际做些什么给出一个基本的解释吗。基本上,请解释一下,就像我5岁一样


谢谢

计算机通过执行非常简单的步骤(称为机器代码或本机代码)来运行任何程序。在这个级别上,任何东西都是一些宽度,有数百万个内存插槽可以存储它们。在编写程序时,通常需要更高级别的抽象,允许我们命名变量和子例程,跟踪内存中包含的值,等等。本机代码本身并没有透露这些信息,但存储的程序文件(无论是库还是可执行文件)通常有一些线索,例如子例程名称。C源代码在声明中提供了这些信息,有些库(如SciPy)具有包装器以将信息保存到另一层,在本例中是Python。Python对象总是保存关于其类型的信息,这与C变量不同。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就是一个很好的例子

嗨,我看到这个了。我不是在寻找如何执行,我只是想定性地理解它的功能。因为ctypes只提供了要集成的本机机器代码函数的地址,该地址会传递给Fortran QUADPACK库中的例程。Scipy没有使用ctypes设计的大部分功能,即在Python和C数据类型之间转换并调用C函数。“CPython包装器”、“Python解释字节码”对于一个5岁的孩子来说不太容易理解在这种情况下,
argtypes
规范是假的(但间接使用)因为第二个参数是数组参数的
double*,所以它实际上毫无意义。这并不重要,因为
scipy.integrate
没有使用ctypes转换参数,甚至没有调用函数。ctypes基本上只用于获取函数的地址。不确定你在和哪个5岁的孩子说话,谁使用多种编程语言进行集成,但我做了一些重写。