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

深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!

在本文中,我们将深入研究 Python 的内部实现,并了解 Python 如何使用一种名为字符串驻留(String Interning)的技术,实现解释器的高性能。...但是,如果字符串是固定的,由于相同的字符串将使用同一个对象引用,因此只需检查指针是否相同,就足以判断出两个字符串是否相等,不必再逐一检查每个字符。...在 CPython 的,字符串驻留是通过以下函数实现的,声明在 unicodeobject.h 中,定义在 unicodeobject.c 中。...以下是函数PyObject_SetAttr的代码片段,该函数定义在文件object.c中,负责为 Python 对象设置新属性。...当使用任何字符串对象调用此函数时,该字符串对象将被驻留。以下是 sysmodule.c 文件的代码片段,它展示了在sys_intern_impl函数中的字符串驻留过程。

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

    再探CC++扩展Python

    上篇博文是初用c/c++扩展Python,只是简单的举个例子,有兴趣的可以去上篇博文里看看那个例子的代码,代码如下: #includePython.h> static PyObject *pr_isprime...该函数的功能是将Python对象C/C++类型数据,如果转换失败,返回0 第一个参数:包含从Python传递到C函数的参数列表的元组对象 第二个参数:是格式参数,必须是字符串,已经预定义好了的,零个或多个...上面例子用的就      是num的地址&num表示的就是num的地址,&是取值运算符 一些常见的格式参数: "s":将Python字符串或Unicode对象转换为C里面字符串的指针,即 Python中...string o或者Unicode 对象转换为C语言里 char * “s#”:“s”上的这个变体存储到两个C变量中,第一个是指向字符串的指针,第二个是它的长度。...这类似于“O”,但有两个C参数:第一个是Python类型对象的地址,第二个是存储对象指针的C变量(类型PyObject *)的地址。如果Python对象没有必需的类型,则会引发TypeError。

    1.1K30

    Python判断输入的字符串是否是整数还是小数

    1.今天遇到一个问题如果输入的是字符串还是整数或者是小数如何将他们区分 首先isdigit()只能用来判断字符串输入的是否是整数,无法判断是否是小数 所以,先判断该字符串是否是整数,如果是返回3,            ...不是的话说明是字母或者是小数,然后判断是否是小数,如果是小数的话返回1,            是字母的或其他的话返回2 def is_float(i):     if i.isdigit():#只能用来判断整数的字符串...and left.startswith('-'):  # 如果小数点左边有-                     new_left = left.split('-')[-1]  # 判断去掉后的还是不是数字...')== 1 and left.startswith('-'):#如果小数点左边有-                     new_left = left.split('-')[-1]#判断去掉后的还是不是数字...print('输入的是小数请重新输入:')         continue     else:         print("输入的是整数没问题")

    1.1K20

    Python调用C函数的方法以及如何编写Python的C扩展

    标题比较长,其实“如何用Python调用C的函数”以及“如何编写Python的C扩展”在广义上是同一件事,因为都是用C写底层实现,用Python作接口。...前段时间笔者用SWIG编译某小段函数一直出BUG,检查了两天才发现原来是因为MinGW 32-bit和Python 64-bit不兼容,加之后续笔者还需要用到NumPy C-API,所以现在笔者已弃坑SWIG...,转用以下方法: 按照Python C-API的编程规范,用C编写底层实现函数。...用Python自带的disutils模块来管理编译、打包、生成Python模块。 所以后续的内容将主要围绕以上的方法来展开。...Python调用add方法时传进来的参数在args里 PyObject* wrap_add(PyObject* self, PyObject* args) { int a, b, result;

    2.5K60

    Mac轻松几步搭建Python源码阅读环境 | Python基础

    、安装 首先安装编译依赖的工具库: gcc // 编译工具 zlib // 压缩、解压相关库 libffi // Python 所以来的用于支持 C 扩展的库 openssl /...Python 标准库 lib/python3.9/config-3.9m-{platform}  存放的是libpython3.9m.a,该静态库用于使用C语言进行扩展Python。...尝试修改源码 下面编译验证Python的Python C API打印对象接口 [2],源文件在Objects/object.c int PyObject_Print(PyObject *op, FILE...*fp, int flags) 假如我们希望在解释器交互界面中打印整数值的时候输出一段字符串,则可以修改如下函数,源文件在Objects/longobject.c static PyObject *...PyUnicode_FromString用于把C中的原生字符数组转换为Python中的字符串Unicode对象 PyObject_Print则将转换好的字符串对象打印至我们指定的标准输出stdout

    1.1K30

    Python字符串的前世今生

    在Unicode时代,Python字符串已被证明是处理文本的一种便捷方法。 在本文中,我们就来研究Python字符串是如何演化并能处理各类文本的,特别是窥视其幕后的运作方式。...该标准还规定了各种字符属性,例如字符是字母、数字还是其他符号,是从左向右还是从右向左书写,是大写字母、小写字母还是根本没有大小写之分。所有这些信息都包含在Unicode字符数据库.。...回想一下,CPython提供了Python/C API ,允许编写C扩展。特别是,它提供了一组处理字符串的函数。...首先让我们看看CPython如何表示使用新API创建的字符串,这些被称为“规范”字符串。它们包括在编写Python代码时创建的所有字符串。PyASCIIObject用于表示仅限ASCII的字符串。...第三,标准库提供了使用Unicode的函数。例如,我们可以使用unicode/utf8 包提供的函数ValidString()来检查给定的字符串是否是有效的UTF-8序列。

    1.7K10

    扩展和嵌入Python之获取程序出错信息

    接着我们上次的内容继续。简单回顾下,上次的这种嵌入方式在Python中称为纯嵌入,我们可以定义自己的模块,在模块中定义自己的函数,通过C API可以让Python解释器识别我们的自定义模块。...就像程序员最不喜欢写文档,然后也很痛恨接手的项目没有文档一样~~~如何获取嵌入Python的报错信息,就是本次的主要内容。...在这里看到了PyErr_Fetch(&ptype,&pvalue,&ptraceback)该函数是如何使用的,需要先“编译”python文件,在编译过程中出错才可以调用该函数捕获出错信息。...PyObject *pstr = PyObject_Str(pvalue) 、const char* err_msg = PyUnicode_AsUTF8(pstr),python C API中的类型大多是...PyObject *,这里提供了一种转为c中char*的方法。

    1.1K30

    C++ 调用Python3

    这个函数会返回一个Python对象的指针,在C++中表示为PyObject。...这些函数的格式为PyXXX_AsXXX 或者PyXXX_FromXXX,一般带有As的是将Python对象转化为C++数据类型的,而带有From的是将C++对象转化为Python,Py前面的XXX表示的是...比如 PyUnicode_AsWideCharString 是将Python中的字符串转化为C++中宽字符,而 Pyunicode_FromWideChar 是将C++的字符串转化为Python中的字符串...这里需要注意一个问题就是Python3废除了在2中的普通的字符串,它将所有字符串都当做Unicode了,所以在调用3的时候需要将所有字符串转化为Unicode的形式而不是像之前那样转化为String。...解析元组 Python 函数返回的是元组,在C++中需要进行对应的解析,我们可以使用 PyTuple_GetItem 来获取元组中的数据成员,这个函数返回PyObject 的指针,之后再使用对应的转化函数将

    2.5K50

    讲解ImportError: dynamic module does not define module export function (PyInit_example)

    方法三:检查模块文件路径 如果模块已经正确编译,并且初始化函数名称也正确,那么可能是模块文件的路径问题导致无法找到初始化函数。...首先,我们需要编写源文件example.c: cCopy code #include Python.h> static PyObject* example_add(PyObject* self, PyObject...为了解决这个错误,我们需要确保编译环节没有错误,并检查初始化函数的名称是否正确。 Python C扩展模块是指通过C或C++语言编写的模块,可以用于在Python中调用和使用C/C++代码。...使用C扩展模块可以提供更高的性能和灵活性,特别是在对计算密集型任务进行优化或者与现有C/C++代码进行交互的场景中。 Python C扩展模块的编写需要遵循一定的规范和步骤。...下面是编写Python C扩展模块的详细介绍: 引入头文件:首先要引入Python的C API头文件 Python.h,这个头文件定义了连接Python和C扩展模块的接口和函数。

    4.3K10

    使用 C 或 C++ 扩展 Python

    Python 的 API 可以通过在一个 C 源文件中引用 "Python.h" 头文件来使用。 扩展模块的编写方式取决与你的目的以及系统设置;下面章节会详细介绍。...注解:C扩展接口特指CPython,扩展模块无法在其他Python实现上工作。在大多数情况下,应该避免写C扩展,来保持可移植性。...第三个参数的含义是参数变长,第四个参数是一个说明性的字符串。导出表总是以{NULL, NULL, 0, NULL}结束。 导出函数initgreat_module。...Python API 中的函数 PyArg_ParseTuple() 会检查参数类型并将其转换为 C 值。它使用模板字符串确定需要的参数类型以及存储被转换的值的 C 变量类型。细节将稍后说明。...这是一个真正的PY对象,而不是 NULL 指针。 5、 模块方法表 为了展示 great_function() 如何被Python程序调用。

    1.6K22

    工具丨用C语言扩展Python的功能

    此外,由于Python从本质上讲还是一种脚本语言,某些功能用Python实现可能很难满足实际软件系统对执行效率的要求,此时也可以借助Python提供的扩展功能,将这些关键代码段用C或者C++实现,从而提供程序的执行性能...本文主要介绍Python提供的C语言扩展接口,以及如何使用这些接口和C/C++语言来对Python进行功能性扩展,并辅以具体的实例讲述如何实现Python的功能扩展。...2.1Python对象(PyObject) Python是一门面向对象的脚本语言,所有的对象在Python解释器中都被表示成PyObject,PyObject结构包含Python对象的所有成员指针,并且对...2.3数据类型 Python定义了六种数据类型:整型、浮点型、字符串、元组、列表和字典,在使用C语言对Python进行功能扩展时,首先要了解如何在C和Python的数据类型间进行转化。...2.3.1整型、浮点型和字符串 在Python的C语言扩展中要用到整型、浮点型和字符串这三种数据类型时相对比较简单,只需要知道如何生成和维护它们就可以了。

    3.4K90

    NumPy 1.26 中文文档(四十五)

    NumPy Distutils 预处理以自定义模板语言编写的 C 源文件(扩展名:.c.src)以生成 C 代码。@符号用于包装宏样式的变量,以实现可能描述(例如)一组数据类型的字符串替换机制。...NumPy Distutils 对使用自定义模板语言编写的 C 源文件(扩展名:.c.src)进行预处理以生成 C 代码。@符号用于包装宏样式的变量,以提供描述(例如)一组数据类型的字符串替换机制。...C 源文件(无论是在 NumPy 本身还是在使用 NumPy Distutils 的任何第三方包中),都使用conv_template.py进行预处理。...NumPy Distutils 预处理用自定义模板语言编写的 C 源文件(扩展名:.c.src)以生成 C 代码。@符号用于包装宏风格变量,以实现描述(例如)一组数据类型的字符串替换机制。...‘b’表示布尔,‘i’表示有符号整数,‘u’表示无符号整数,‘f’表示浮点数,‘c’表示复数浮点数,‘S’表示 8 位以零结尾的字节,‘U’表示 32 位/字符的 Unicode 字符串,‘V’表示任意

    1.1K10

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

    PyTorch 如何通过扩展 Python 解释器来定义可以从 Python 代码中调用的 Tensor 类型? 2. PyTorch 如何封装实际定义 Tensor 属性和方法的 C 的类库?...这是一个用 C 编写的被称为「扩展模块」的 Python 模块,它允许我们定义新的内置对象类型(例如 Tensor)和调用 C / C ++函数。 ....Python 运行时将所有 Python 对象都视为 PyObject * 类型的变量,PyObject * 是所有 Python 对象的「基本类型」。...它使用 CPython 的框架来扩展 Python 解释器并定义新的类型,同时尤其关注为所有类型生成代码。 PyTorch 如何封装实际定义 Tensor 属性和方法的 C 的类库?...资源: https://docs.python.org/3.7/extending/index.html 对于理解如何编写 Python 的 C / C++扩展模块极具价值。 ?

    3.2K50

    C++调用Python

    Python嵌入的原理 在一个C/C++程序中使用Python程序有两种方式: 1. 使用使用一个可变的Python字符串,通过Python引擎执行 2....); 其中第一个参数就是Python中的元组对象,第二个参数是format,这里使用两个f表示是两个浮点数类型的数据,最后两个参数指向需要加载数据的地址。...“s” (string) [char *] :将C字符串转换成Python对象,如果C字符串为空,返回NONE “s#” (string) [char *, int] :将C字符串和它的长度转换成Python...,加入了一些错误检查以及对于已经创建的但是后续不再使用的Python对象及时释放掉。...获得函数对象引用之后使用PyCallable_Check验证函数是否是可执行的 2. 完成函数调用之后使用PyErr_Occurred检查是否有异常发生 3.

    10.2K76
    领券