首页
学习
活动
专区
圈层
工具
发布

Python: C扩展初体验

哪怕工作中比较少机会自己写C扩展, 了解这块的知识,也有利于我们更加深入了解 Python 的运行本质。...可以简单理解成就是 Python 和 C 的对接函数,举个栗子: static PyObject *test(PyObject *self, PyObject *args){ int arg1,...C 用法用点不同了,特别是在函数形参那边的PyObject self, PyObject args 第一个参数是 PyObject *self,这个参数是Python内部使用的,可以不用管; 第二个参数是...它是一个参数列表,把所有的参数都整合到 一个 string, 因此,如果我们需要解析这些参数需要用特定的姿势!我们需要用到 PyArg_ParseTuple 来解开这个扣人心弦的入口!...同样的,如果我们想要找一个模块的 Python 函数 对应什么的 C模块方法,也能通过这地方比较粗暴得知,例如 Python 的 list # 取自 Python2.7 object/listobject.c

1.4K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一个Tensor的生命历程(Pytorch版)

    文中涉及到大量的Pytorch的C++源码,版本为1.4.0a,适合有一定Pytorch源码基础的童鞋观看,同时也涉及到一些python中的C/C++拓展的一些基础知识,其中每一段代码的第一行表明了该代码的文件位置...python中的模块: void initTorchFunctions(PyObject* module) { if (PyType_Ready(&THPVariableFunctions) python端调用的时候会在生成的torch_C....我们可以看到table就是ATenOpTable类的一个实例,而callUnboxed是它的一个方法,这个方法根据传递的模板参数返回了特定的函数: // build/aten/src/ATen/TypeDefault.cpp...args)...)); } 这个Tensor是一个通用的对象,包含一个指向TensorImpl对象的指针,实际开辟的空间位置指针还在TensorImpl中的storage_中。

    97920

    Python: 函数与方法的区别 以及 Bound Method 和 Unbound Method

    函数与方法的区别 随着我们越来越频繁使用Python, 我们难免会接触到类, 接触到类属性和方法.但是很多新手包括我, 不知道方法 和 函数 的区别,这次简单来讨论下, 如果有哪里认识不正确, 希望大神提点指教...: //取自: python2.7/objects/ceval.c TARGET(LOAD_ATTR) { w = GETITEM(names,...来调用这个函数对象, 继续来看看具体过程: //取自: python2.7/objects/ceval.c TARGET(CALL_FUNCTION) { PyObject...PyCFunction, 所以将会落入上面源码的判断分支中, 而它将要做的,就是分别通过 PyMethod_GET_SELF, PyMethod_GET_FUNCTION 获得self对象和func函数...(_py_tmp); \ } while (0) 可以看出, Py_SETREF是用这个self对象替换了pfunc指向的对象了, 而pfunc在上面已经提及到了

    2K10

    再探CC++扩展Python

    上篇博文是初用c/c++扩展Python,只是简单的举个例子,有兴趣的可以去上篇博文里看看那个例子的代码,代码如下: #includePython.h> static PyObject *pr_isprime...C程序因此接收被传递的实际对象。对象的引用计数不增加。存储的指针不为NULL。(object)→[PyObject *] “O!":将Python对象存储在C对象指针。...这类似于“O”,但有两个C参数:第一个是Python类型对象的地址,第二个是存储对象指针的C变量(类型PyObject *)的地址。如果Python对象没有必需的类型,则会引发TypeError。...)NULL, \        PYTHON_API_VERSION) 是宏定义,接受两个参数,第一个参数为字符串,表示模块的名称;第二个参数是一个PyMethodDef的结构体数组,表示该模块都具有哪些方法...* 第一个是一个字符串,表示在Python中对应的方法的名称;  * 第二个是对应的C代码的函数;  * 第三个是一个标致位,表示该Python方法是否需要参数,METH_NOARGS表示不需要参数,METH_VARARGS

    1.1K30

    HPy - 为 Python 扩展提供更优秀的 C API

    官方的 Python/C API 是针对 CPython 的实现的:公开了许多内部细节,使得 API 实现难度较大;而且,如果要为 PyPy、GraalPython、Jython、IronPython...HPy 介绍 HPy 提供了一个新的 API,以用 C 扩展 Python,有零开销、更快速、方便调试、通用的二进制文件(不用任何修改,可在 CPython、PyPy、GraalPython 等解释器上直接加载...更好的 API:标准的 Python/C API 具有其产生时代的特性限制,而 HPy 的设计可以克服一些限制。让扩展 API 更加一致,更易写易读,并且可使 bug 更易于暴露。...HPy 示例 概念和优点,都是官方的说法,我们实际代码操练一下,看看试用体验,以及 HPy 是否具有优势。示例很简单,即实现一个 add 运算的扩展。...首先,我们用标准 Python/C 扩展方式实现 命名文件为 hello_old.c: #include Python.h> static PyObject* add(PyObject* self,

    99310

    Python & C++ - pybind11 实现解析

    由于Python的虚拟机以及相关的C API较复杂, 我们选择的方式是将 pybind11 - 一个Python社区知名度比较高, 实现质量也比较高的 Python 导出库与我们引擎的 C++ 反射适配的整合方式...通过这种层级式的类型设计, pybind11 就能特定层处理特定事务的方式, 为解决好 C++ 类型在 Python 虚拟机中的表达提供一个基础支持了...., 最终我们将类型已经是 PyCFunction 的 dispatcher() 注册到 Python 虚拟机中, 完成整个注册过程. dispatcher() 就是一个标准的 PyCFunction,...Python 的各种 PyObject 类型, 在一些特定的地方, 我们可能会直接对使用到相关类型的函数或者变量进行导出, 这就会存在这种 wrapper 类型本身跟 Python 进行交互的转换的需要...特性来实现特定功能的方式不是特别可取, 一般我们会选择实现 is_udt 类似的宏来准确判断一个类型是否是我们预期的UDT, 但 pybind11 作为一个从 c++11 特性开始迭代的库, 使用这种设计

    3.7K80

    教程 | PyTorch内部机制解析:如何通过PyTorch实现Tensor

    Python 运行时将所有 Python 对象都视为 PyObject * 类型的变量,PyObject * 是所有 Python 对象的「基本类型」。...每个 Python 类型包含对象的引用计数,以及指向对象的「类型对象」的指针。类型对象确定类型的属性。例如,该对象可能包含一系列与类型相关联的方法,以及调用哪些 C 函数来实现这些方法。...是引入实现对象的引用计数的代码的宏,以及指向相应类型对象的指针。...我们可以通过定义 https://docs.python.org/3.7/c-api/typeobj.html#c.PyMappingMethods 里描述的三种映射方法来使用[]符号。...例如,csrc/generic/Tensor.h 具有如下声明: THP_API PyObject * THPTensor_(New)(THTensor *ptr); 我们使用相同的策略在头文件的源文件中生成代码

    3.2K50

    C++调用Python

    释放Python解释器 2、Python C API基础 Python C API介绍 Python C API基本方法如下所示(第一列对应C API的使用,第二列对应Python中的使用): C API...函数作为输入和输出,而在Python C API中使用PyArg_Parse*形式的函数来将Python 对象转换成对应的C类型。...当然,你也可以使用Py_BuildValue来构造Python对象,例如创建一个指向浮点数的Python对象: PyObject pyfloat; float pi = 3.141592654; pyfloat...获得函数对象引用之后使用PyCallable_Check验证函数是否是可执行的 2. 完成函数调用之后使用PyErr_Occurred检查是否有异常发生 3....检查返回的结果类型是否符合要求,PyFloat_Check等 参考 https://www6.software.ibm.com/developerworks/education/l-pythonscript

    10.2K76

    Python源码分析(二) - List对象

    PyListObject对象的创建与维护 创建   在列表对象的实现文件listObject.c文件中,我们可以看到,Python对于创建一个列表,提供了唯一的一条途径,就是PyList_New(),对应的代码如下...在创建PyListObject对象时,首先检查缓冲池中free_list是否有可用的对象,如果有,则直接使用,若没有可用对象,则通过PyObject_GC_New在系统堆中申请内存,在Python2.7.12...,然后进行索引的有效性检查,当类型检查和索引检查均通过的时候,就可以将待加入的Pyobject*指针放在指定的位置了。...PyListObject对象缓冲池   在这之前,我们学习到,在创建PyListObject对象时,会首先检查缓冲区中的free_lists中是否有可用的对象。   ...在删除PylsitObject对象自身时,Python会先检查我们开始提到的那个缓冲池free_list,查看其中缓存的PyListObject的数量是否已经满了,如果没有,就将待删除的PyListObject

    92520
    领券