1.字符串intern机制

用了这么久的python,时刻和字符串打交道,直到遇到下面的情况:

a = "hello"
b = "hello"
print(a is b) #--->True
print(a == b) #---> True a = "hello world"
b = "hello world"
print(a is b) # ---> False
print(a == b) # --->True

咦,这是怎么肥事?我们知道 '=='是用来比较两个变量的字面值是否一致,而 'is'是用来比较前后两个变量是否根本就是同一对象,也就是指向同一个内存地址。好吧,不信这个邪,试试用id方法看一下各自的地址。

>> a = 'hello'
>>> b = 'hello'
>>> id(a)
4482507864
>>> id(b)
4482507864 >>> a = 'hello world'
>>> b = 'hello world'
>>> id(a)
4482504112
>>> id(b)
4482504176

果然是这样,前面的a,b共用对象了,而后面的a,b的就直接当新对象来处理了。一般来说,新对象建立都会直接开辟一个新的内存使用,但这样的就很容易占用资源,造成内存的浪费,所以python中建立了池化(intern)的概念,即对值相同的字符串对象只会保存一份,相当于共用一个字符串池,当需要值相同的字符串的时候(比如标识符),直接从池里拿来用,避免频繁的创建和销毁,提升效率,节约内存。

但是并不是所有的字符串都会采用intern机制。只包含下划线、数字、字母的字符串才会被intern。这也就是我们看到的,为什么后面的例子中的a,b还是以新对象来处理了。

2.整数对象的内存机制

无独有偶,对于数字这种常用的数据类型,也有这样一种类似机制:

a = 1
b = 1
print(a is b) # --->True
print(a == b) # ---> True a = 320
b = 320
print(a is b) # --->False
print(a == b) # --->True

难道是个位的整数就是共对象了?也并非如此,python规定了[-5,257)的范围内为小整数池,即这个范围的整数使用时不用再创对象,直接取来用就好。

而对于大整数还是当作正常对象处理,每次使用均创建⼀个新的对象。

1.字符串池化(intern)机制及拓展学习的更多相关文章

  1. python中小整数对象池及intern机制

    小整数对象池: Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁 Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收,所有位于这个范围 ...

  2. 字符串池化 python

    前言 在 Python 中经常通过内存池化技术来提高其性能,那么问题来了,在什么情况下会池化呢? 让我们通过几个例子进行一下理解一下. 预备知识 在查看例子之前,首先要提 python 中的一个函数 ...

  3. 小整数池和intern机制

    在python中,为了优化速度,避免频繁申请和销毁内存空间,python使用小整数池来缓存 range(-5,257) 之间的整数(这里不包含257),这些小整数在赋值引用时使用的都是同一个对象和内存 ...

  4. Python中字符串的intern机制

    intern机制: 字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的 ...

  5. 【37】池化层讲解(Pooling layers)

    池化层(Pooling layers) 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们来看一下.   先举一个池化层的例子,然后我们再讨论池化层的 ...

  6. 【python实现卷积神经网络】池化层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  7. 空间金字塔池化 ssp-net

    <Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition>,这篇paper提出了空间金字 ...

  8. 什么是string interning(字符串驻留)以及python中字符串的intern机制

    Incomputer science, string interning is a method of storing only onecopy of each distinct string val ...

  9. 我不知道的C#—字符串池机制

    字符串具有值类型的特点对字符串,对同一个字符串大量修改或者对多个引用赋值同一个字符串对象时会产生大量的临时字符串对象,影响性能,但是CLR为我们做了一些工作来消除这些弊端.      对同一个字符串大 ...

随机推荐

  1. win10更新后IE不见了

    只是快捷方式不见了,到C:\Program Files\internet explorer\iexplore.exe就看到了,可以正常运行

  2. POI2011 Tree Rotations

    POI2011 Tree Rotations 给定一个n<=2e5个叶子的二叉树,可以交换每个点的左右子树.要求前序遍历叶子的逆序对最少. 由于对于当前结点x,交换左右子树,对于范围之外的逆序对 ...

  3. 使用box-shadow 实现水波、音波的效果

    用到的工具 animation box-shadow html: <div class="watersource"> </div> css: .waters ...

  4. HTTP Status 500 - org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:

    HTTP Status 500 - org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.e ...

  5. Unity 关节

    引言 关节组件一共分为5大类,它们分别是链条关节.固定关节.弹簧关节.角色关节和可配置关节. 链条关节(Hinge Joint):将两个物体以链条的形式绑在一起,当力量过大超过链条的固定力矩时,两个物 ...

  6. 2-29 while

    do while for

  7. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_dynamic基元类型

    1.代码使用 dynamic 表达式/变量来调用一个成员时,编译器会生成特殊的 IL 代码来描述所需的操作.这种特殊的代码称为 payload(有效载荷).在运行时,payload 代码根据当前由 d ...

  8. python 获取当前时间及前一天时间

    import datetime from pandas.tseries.offsets import Day now_time =datetime.datetime.now()#获取当前时间 yes_ ...

  9. stringstream的使用

    stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream.fstream有类似的操作方式.要使用stringstream, 必须先加入这一行: # ...

  10. Unity 平台宏定义

    官方文档: https://docs.unity3d.com/Manual/PlatformDependentCompilation.html