Python进阶学习
文章平均质量分 88
CPython v3.12.1 源码学习;Python扩展编写。
rainbowkv
这个作者很懒,什么都没留下…
展开
-
CPython v3.12.1 源码学习番外篇(三):编写CUDA扩展
前两篇我们已经编写了Python的C和C++扩展,分别使用了CPython官方的接口和Pybind11对前者友好封装的接口。本篇我们来编写一个CUDA程序来调度显卡,进一步写成Python的扩展包。您如果看过C++扩展篇本篇会非常轻松。有了前面的基础,CUDA扩展的步骤是类似的,几乎仅仅是.cpp文件换为了.cu文件而已。您需要安装一个CUDA库,官方下载地址,本文选用CUDA18:在其bin目录下,有nvcc.exe这个编译.cu文件的编译器。如果cmake部分您觉得不够详细,请您查看。原创 2024-06-22 02:10:10 · 865 阅读 · 0 评论 -
CPython v3.12.1 源码学习番外篇(二)的补充知识:CMake构建C/C++项目
CMake是一个构建C/C++项目的工具,编写正确的CMakeLists.txt即可完成大部分场景。我们将仅编写1个.h文件和1个.cpp文件然后制作一个动态库(Windows下为.dll,Linux为.so文件)。原创 2024-06-19 23:51:12 · 355 阅读 · 0 评论 -
CPython v3.12.1 源码学习番外篇(二):编写C++扩展
番外篇二,我们将利用一个使用dll动态库的C++项目,然后使用Pybind11轻松将其编写为Python的包。它将同时具有一个不错的C/C++工程目录结构和Python包结构,可参考Pytorch的目录。您如果具有[]和[]的基础,会更快理解本文。我们会使用到[]构建的rb_math.dll、rb_math.lib和rb_math.h文件,您也可以使用自己的库编写为Python拓展。原创 2024-06-19 23:48:53 · 1042 阅读 · 2 评论 -
CPython v3.12.1 源码学习番外篇(一):编写C扩展
编写Python的C/C++扩展原创 2024-06-19 15:18:04 · 1002 阅读 · 0 评论 -
CPython v3.12.1 源码学习Windows篇(一)
这里有无异常都会进行config的clear内存释放,虽然这里config是栈变量,但其内部包含了指向堆的指针,需保证动态分配的内存也被正确释放,否则config被自动释放后,堆上的内存可能没引用但也没释放(内存泄漏。下面就是检查了一次path0,然后将其赋值给了interp->runtime->sys_path_0和interp->sysdict这个字典的"path"键的项,它就是Python层面的sys.path,然后插入到0号位置。然后就是设置sys.path[0]的部分,可以看到。原创 2024-06-13 18:36:01 · 283 阅读 · 0 评论 -
CPython v3.12.1 源码学习Windows篇(二)
上一篇我们介绍到了_PyInterpreterState_SetRunningMain这个函数,接下来CPython就会根据你是在执行模块还是代码还是脚本,来选择不同的分支进入了,如下:这个分支就是当你执行python xxx.py进入的分支,突击检查:Python的工作目录是解释器所在目录还是py文件所在目录?为什么?(上一篇看完,你应该能回答)进入pymain_run_file,可以看到先将你的py文件名转化为了python的对象,更具体来说是PyUnicode_Type这个对象(C语言原创 2024-06-13 23:44:10 · 564 阅读 · 0 评论 -
CPython v3.12.1 源码学习Windows篇(三)
很幸运,我们的脚本字节码序列在python解释器执行的所有字节码的末尾段,在此之后,仅仅多了一个INTERPRETER_EXIT字节码,字节码的执行就退出了(C层面应该还有些其它工作)。数一下一共是六条字节码,那么让我们稍微修改下CPython源码,让它逐个打印执行的字节码,看看字节码顺序和个数能否对应上。要检测这个的话,显然我们需要检测下面这个分支执行了多少次,因为每执行一次字节码,走一次这个switch case。没错,证明我们的函数是有效的(当然一次成功也可能是偶然,不要在意这里的严谨性)。原创 2024-06-15 22:44:44 · 409 阅读 · 0 评论