当前位置: 首页 > news >正文

Python:Python进阶:Python字符串驻留技术

Python字符串驻留技术

  • 1.什么是字符串驻留
  • 2. 为什么要驻留字符串
  • 3. Python的字符串驻留
  • 4. Python 字符驻留原理
    • 4.1 如何驻留字符串
    • 4.2 如何清理驻留的字符串
  • 5. 字符串驻留的实现
    • 5.1. 变量、常量与函数名
    • 5.2 字典的键
    • 5.3 任何对象的属性
    • 5.4 显式地驻留
  • 6 字符串驻留的其他发现

由于字符串是任何编程语言中不可或缺的一个部分,因此,如果有快速操作字符串的能力,就有可以迅速的提高整体的性能。
本文,我们将深入研究Python 的内部实现,并了解 Python如何使用一种名为字符串驻留 (string Interning)的技术,实现解释器的高性能。以下是本文的提纲

在这里插入图片描述

1.什么是字符串驻留

  1. 字符串驻留是编译器/解释器的优化方法,它通过 缓存一般性的字符串,从而节省字符串处理任务的空间和时间。
    事实上这种优化方法不会每次都创建一个新的 字符串副本,而是仅为每个适当的不可变值保留一个字符串副本,并使用指针引用之。
  2. string interning 一般译为 “ 字符串驻留或字符串留用” 在某些 语言中可能习惯使用 string pool (字符串常量池)的概念,其实这是对同一种机制的不同表述。
    在这里插入图片描述

2. 为什么要驻留字符串

  1. 首先字符串驻留提升了字符串比较的速度。 如果没有驻留,当我们要比较两个字符串是否相等时,它的时间复杂度将会上升到 o(n) ,即需要检查两个字符串中的每个字符,才能判断他们是否相等。
  2. 但是,如果两个字符串使用的是同一个对象的引用,那么我们只需要判断检查指针是否相同,就足以判断出两个字符串是否相同,不需要逐一检查每个字符串。
  3. 字符串驻留技术减少了内存占用,Python避免内存中 充斥多余的字符串对象,通过享元设计模式共享和重用已经定义的对象,从而优化内存占用。

3. Python的字符串驻留

在Python中使用 is 运算符 ,检查两个对象是否引用同一个内存对象。注意在 Python3.8 版本之后,需要使用 == 来判断两个对象是否相等。

"python" == 'python'  # true
1==2 # false
"Python" == 'python'  # false

4. Python 字符驻留原理

在 CPython 中,字符串的引用被一个名为 interned 的 python字典所存储,访问和管理。该字典在第一调用字符串驻留时,被延迟的初始化,并持有全部已驻留字符串对象的引用。

4.1 如何驻留字符串

在 CPython 中,负责驻留字符串的核心函数是 PyUnicode_InternInplace 它定义在 unicodeobject.c 中,当调用时,它会创建一个准备容纳所有驻留字符串的字典 Interned , 然后登记入参中的对象,然后另其键和值都使用相同的对象引用

void PyUnicode_InternInplace(PyObject **p)
{PyObject *s = p;........// Lazing build the dicrionary to hold interned stringsif (interned ==NULL) {interned  = PyDict_New();if (interned ==NULL){PyErr_Clear();return;}}PyObject *t;// make an entry to the interned dictionary for the given objectt = PyDict_SetDefault(interned, s, s);......// set the state of the string to be INTERNED_PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL;
}

4.2 如何清理驻留的字符串

清理函数从 interned 字典中遍历所有的字符串,调整这些对象的引用计数,并把它们标记为 NOT_INTERNED, 使其被垃圾回收,一旦所有的字符串被标记为 NOT_INTERNED,则 interned 字典会被清空并删除。

这个清理函数就是 _PyUnicode_ClearInterned ,在 unicodeobject.c 中定义

void _PyUnicode_ClearInterned(PyThreadState *tstate)
{// Get all the keys to the interned dictionaryPyObject *keys = PyDict_Keys(interned);.......// Interned Unicode strings are not forcibly deallocated// rather ,we give them their stolen references back// and then clear and DECREF the interned dictfor(Py_ssize_t i = 0; i< n; i++){PyObject *s = PyList_GET_ITEM(keys,i);.....switch (PyUnicode_CHECK_INTERNED(s)){case SSTATE_INTERNED_IMMORTAL:Py_SET_REFCNT(s,Py_REFCNT(s)+1);break;case SSTATE_INTERNED_MORTAL:// Restore the two references(key and balue) ignored// by PyUnicode_InterInPlace()Py_SET_REFCNT(s,Py_REFCNT(s) +2);break;case SSTATE_NOTINTERNED:default:Py_UNREACHABLE();}// making the string to be  NOT_INTERNED_PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED;}// decreasing the refernece to the initialized and// access可以是objectPy_DECREF(keys);// clearing the dictionaryPyDict_Clear(interned);// clearing the object internedPy_CLEAR(interned);
}

5. 字符串驻留的实现

这一小节主要讲:Python会驻留哪些字符串

5.1. 变量、常量与函数名

CPython 对常量(例如函数名,变量名,字符串字面量等)执行字符串驻留。

5.2 字典的键

CPthon 还会驻留任何字典对象的字符串键

5.3 任何对象的属性

CPython中对象的属性可以通过 setattr 函数显式地设置,也可以作为类成员的一部分隐式的设置,或者在其数据类型中定义。
CPython会驻留所有这些属性名,以便实现快速的查找。

5.4 显式地驻留

Python还支持通过 sys模块中的 intern 函数进行显示地字符串驻留。

6 字符串驻留的其他发现

只有在编译期的字符串会被驻留,咋解释时或编译时指定的字符串会被驻留,而动态创建的字符串则不会

相关文章:

Python:Python进阶:Python字符串驻留技术

Python字符串驻留技术 1.什么是字符串驻留2. 为什么要驻留字符串3. Python的字符串驻留4. Python 字符驻留原理4.1 如何驻留字符串4.2 如何清理驻留的字符串 5. 字符串驻留的实现5.1. 变量、常量与函数名5.2 字典的键5.3 任何对象的属性5.4 显式地驻留 6 字符串驻留的其他发现 …...

2022年 全国职业院校技能大赛(中职组)网络安全赛项 正式赛卷 A模块 做题记录

评分标准文件及环境 评分标准&#xff1a;ZZ-2022029 网络安全赛项正式赛卷.zip 自己做的Linux靶机&#xff1a; 自己做的Windows靶机&#xff1a; 文章目录 评分标准文件及环境A-1 任务一 登录安全加固1. 密码策略&#xff08;Windows&#xff0c;Linux&#xff09;a. 最小密…...

华为OD机试 - 优选核酸检测点(Python)

题目描述 张三要去外地出差,需要做核酸,需要在指定时间点前做完核酸,请帮他找到满足条件的核酸检测点。 给出一组核酸检测点的距离和每个核酸检测点当前的人数给出张三要去做核酸的出发时间 出发时间是10分钟的倍数,同时给出张三做核酸的最晚结束时间题目中给出的距离是整…...

windows怎么把包含某个关键词的文件移动到一个文件夹中

文章目录 windows怎么把包含某个关键词的文件移动到一个文件夹中问题来源省流版本操作过程具体问题方法一&#xff1a;使用cmd终端解决方法二&#xff1a;使用python脚本 总结 windows怎么把包含某个关键词的文件移动到一个文件夹中 问题来源 今天想移动window文件&#xff0…...

Unity 后处理(Post-Processing) -- (2)创建后处理配置文件

通过前面一小节&#xff0c;我们初步认识了后处理是什么&#xff0c;在Unity中简单的试了试后处理的效果。本节我们来创建一个我们自己的后处理配置文件&#xff08;post-processing profile&#xff09;。 一个后处理配置文件包含了一系列为了达到特定视觉效果的后处理效果的配…...

BI 商业智能和报表,傻傻分不清楚?一文给你讲透

我们经常所听到的大数据、商业智能BI、数据分析、数据挖掘等我们都统称为数据信息化。数据信息化可以帮助企业全面的了解企业的经营管理&#xff0c;从经验驱动到数据驱动&#xff0c;降低情绪、心理等主观影响&#xff0c;形成以数据为基础的业务决策支撑&#xff0c;提高决策…...

CSS布局基础(传统布局小结)

传统布局小结 传统布局方式标准流浮动流定位伪类元素CSS应用对象应用到自身应用到其他元素 传统布局方式 传统布局采用 标准流 浮动流 定位的方式实现布局效果&#xff0c;也就是通常所说的 DIV CSS 布局。 标准流 标准流中的元素在 页面默认的 维度&#xff0c;块级元素…...

【五一创作】Qt quick基础1(包含基本元素Text Image Rectangle的使用)

Qt quick基础1&#xff08;包含基本元素Text Image Rectangle的使用&#xff09; 目录 Qt quick基础1&#xff08;包含基本元素Text Image Rectangle的使用&#xff09;前言qt中有直接设计ui的拖拽式的widget&#xff0c;为什么还需要Qtquick?QML语言Qt 版本创建一个Qt quick项…...

LVS+Keepalived 高可用群集部署

一、LVSKeepalived 高可用群集 在这个高度信息化的 IT 时代&#xff0c;企业的生产系统、业务运营、销售和支持&#xff0c;以及日常管理等环节越来越依赖于计算机信息和服务&#xff0c;对高可用&#xff08;HA&#xff09;技术的应用需求不断提高&#xff0c;以便提供持续的…...

小黑子—Java从入门到入土过程:第八章

Java零基础入门8.0 Java系列第八章1. 双列集合 Map1.1 Map 集合中常见的API1.2 Map 集合的遍历方式1.2 - I 第一种遍历方式&#xff1a;键找值KeySet 方法1.2 - II 第二种遍历方式&#xff1a;键值对 entrySet 方法1.2 - III 第三种遍历方式&#xff1a;lambda表达式 1.3 HashM…...

innodb_flush_log_at_trx_commit 和 sync_binlog 参数解析

这两个参数和MySQL的一致性以及性能相关&#xff0c;默认配置大多数情况下不是最优的。一般来说&#xff0c;互联网线上系统的配置&#xff1a; innodb_flush_log_at_trx_commit —— 0 sync_binlog —— 1000 一、innodb_flush_log_at_trx_commit 事务提交刷盘时机 如果我…...

hd debug - DAPLink的资料

文章目录 DAPLink的资料概述笔记库迁出的技巧END DAPLink的资料 概述 查资料时, 看到有DAPLink的资料, 记录一下. 笔记 DAPLink项目分为软件和硬件2部分, 不在一个库中. 总览 : https://daplink.io/ 这个页面上说了软件和硬件项目的库地址. 软件库地址 : https://github.…...

Android adb常用50条命令

1. adb devices - 列出所有连接的 Android 设备及模拟器 2. adb shell - 启动 Android 设备或模拟器的 shell 终端 3. adb install - 安装 APK 文件 4. adb uninstall - 卸载 APK 文件 5. adb logcat - 查看日志输出信息,用于调试应用 6. adb push - 将文件推送到 Andro…...

【无人车】无人驾驶地面车辆避障研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Visual Studio高效调试手段与调试技巧总结

目录 1、对0xCCCCCCCC、0xCDCDCDCD和0xFEEEFEEE等常见异常值的辨识度 2、在Debug下遇到报错弹框,点击重试,查看函数调用堆栈...

Day37 Map集合

Map集合 Map集合是接口&#xff0c;interface Map <K , V> K:键的类型&#xff1b; V&#xff1a;值的类型 将键映射到值得对象&#xff1b;不能包含重复的键&#xff1b;每个键可以映射到最多一个值。例如&#xff1a;001 令狐冲 &#xff1b; 002 岳不群 &#xff1b; …...

是人就能学会的Spring源码教学-Spring的简单使用

是人就能学会的Spring源码教学-Spring的简单使用 Spring的最简单入门使用第一步 创建项目第二步 配置项目第三步 启动项目 Spring的最简单入门使用 各位道友且跟我一道来学习Spring的最简单的入门使用&#xff0c;为了方便和简单&#xff0c;我使用了Spring Boot项目&#xff…...

NOC大赛·核桃编程马拉松赛道知识点大纲(高年级及初中组)

NOC核桃编程马拉松知识点大纲(高年级及初中组) (一)基础语法 1.掌握运动积木的用法。 包括“移动 10 步”、“左/右转 X 度”、“面向 X 方向/鼠标指针/ 角色”、“移到 XY 坐标/鼠标/角色”、“X/Y 坐标的设定和增加”、 “滑行到 XY/鼠标/角色”等积木用法,详细如下。 1…...

第二十六章 Unity碰撞体Collision(上)

在游戏世界中&#xff0c;游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如&#xff0c;攻击怪物则是主角与怪物的碰撞&#xff0c;触发机关则是主角与机关的碰撞。在DirectX课程中&#xff0c;我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…...

Qt Installer Framework使用教程:

步骤一&#xff1a; 下载并安装Qt Installer Framework工具 http://download.qt.io/official_releases/qt-installer-framework/ 将安装目录添加到环境变量&#xff0c;如安装D盘时D:\Qt\QtIFW-4.5.0\bin 步骤二&#xff1a; 将测试例子(如D:\Qt\QtIFW-4.5.0\…...

nodejs+vue+java农村信息化服务平台

用户的登录模块&#xff1a;用户登录本系统&#xff0c;对个人的信息等进行查询&#xff0c;操作可使用的功能。 用户注册模块&#xff1a;游客用户可以进行用户注册&#xff0c;系统会反馈是否注册成功。 添加管理员模块&#xff1a;向本系统中添加更多的管理人员&#xff0c;…...

代码随想录补打卡 62不同路径 63 不同路径2

代码如下 func uniquePaths(m int, n int) int { dp : make([][]int,m) //定义一个二维数组 for i : 0 ; i < m ; i { //遍历这个二维数组的每个元素&#xff0c;并将每个元素都定义为一个一维数组 dp[i] make([]int,n) //这样就生成了图中的一个二维网格 dp[i][0] …...

树的存储和遍历

文章目录 6.5 树与森林6.5.1 树的存储结构1. 双亲表示法(顺序存储结构)2 孩子链表表示法3 孩子兄弟表示法(二叉树表示法) 6.5.2 森林与二叉树的转换1 树转换成二叉树2 二叉树转换成树3 森林转换成二叉树4 二叉树转换成森林 6.5.3 树和森林的遍历1. 树的遍历2. 森林的遍历 6.6 赫…...

MySQL的ID用完了,怎么办?

目 录 一 首先首先分情况 二 自增ID 1 mysql 数据库创建一个自增键的表 2 导出表结构 3 重新创建 自增键是4294967295的表 4 查看表结构 5 异常测试 三 填充主键 1 首先创建一个test 表&#xff0c;主键不自增 2 插入主键最大值 3 再次插入主键最大值1 四 没有声明…...

JSP基于Iptables图形管理工具的设计与实现(源代码+论文)

Netfilter/Iptables防火墙是Linux平台下的包过滤防火墙&#xff0c;Iptables防火墙不仅提供了强大的数据包过滤能力&#xff0c;而且还提供转发&#xff0c;NAT映射等功能&#xff0c;是个人及企业级Linux用户构建网络安全平台的首选工具。但是&#xff0c;由于种种原因&#x…...

什么是数据库分片?

什么是数据库分片&#xff1f; 数据库分片是指将一个大型数据库拆分成多个小型数据库&#xff0c;每个小型数据库称为一个分片。通过这种方式&#xff0c;可以将数据库的负载分散到多个服务器上&#xff0c;从而提高数据库的性能和可伸缩性。 为什么需要数据库分片&#xff1f…...

软件工程知识点

软件工程提出的时代和背景 软件工程化的层次 软件开发过程 敏捷与计划开发 演化式开发和DevOps 软件配置管理过程和相关工具名 软件质量和代码异味 能够分析常见的代码异味和bug 代码复杂度和计算圈复杂度 了解代码异味和重构行为的关系 了解自动化单元测试框架xunit…...

华为OD机试 - 投篮大赛(Python)

题目描述 你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。 比赛开始时,记录是空白的。 你会得到一个记录操作的字符串列表 ops,其中ops[i]是你需要记录的第i项操作,ops遵循下述规则: 整数x-表示本回合…...

《花雕学AI》讯飞星火认知大模型的特点和优势,与ChatGPT的对比分析

引言&#xff1a; 人工智能是当今科技领域的热门话题&#xff0c;自然语言处理是人工智能的重要分支。自然语言处理的目标是让计算机能够理解和生成自然语言&#xff0c;实现人机交互和智能服务。近年来&#xff0c;随着深度学习的发展&#xff0c;自然语言处理领域出现了许多创…...

【Python入门】Python的判断语句(if else 语句)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…...