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. Java项目之项目模板(登录注册)

    链接:http://pan.baidu.com/s/1hskYopm 密码:vffl

  2. ArcGIS api for javascript-图层控制(图层树)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. Qt 学习之路 2(5):自定义信号槽

    Home / Qt 学习之路 2 / Qt 学习之路 2(5):自定义信号槽 Qt 学习之路 2(5):自定义信号槽  豆子  2012年8月24日  Qt 学习之路 2  131条评论 上一节我们详 ...

  4. postfix 实现邮件发送 配置

    1.安装postfix 使用 rpm –qa postfix检查是否安装了postfix,如果没有,使用yum install postfix. 2 .配置/etc/postfix/main.cf [ ...

  5. Linux防火墙详解

    1.Linux防火墙基础 作为隔离内外网.过滤非法数据的有力屏障,防火墙通常按实现环境的不同分为硬件防火墙和软件防火墙.硬件防火墙是功能专一的硬件设备,具有比较全面的功能,其工作效率较高,但是加个昂贵 ...

  6. hxml总结

    段落<p> br 换行 hr 分割线 &nbsp 空格 &gt  > &lt < &  &amp h        7级标题 <i ...

  7. spark 2.X 疑难问题汇总

    当前spark任务都是运行在yarn上,所以不用启动长进程worker,也没有master的HA问题,所以主要的问题在任务执行层面. 作业故障分类故障主要分为版本,内存和权限三方面. - 各种版本不一 ...

  8. Ubuntu14.10:Install Apache,PHP,Mysql以及扩展库

    step 1: Apache sudo apt-get install apache2 After have apache2 installed, go to localhost by browser ...

  9. beeline hiveserver2 start

    1. install hive 2. start hiveserver2 查看hiverserver2 是否正常运行: ps -ef | grep hive 2. start beeline 3. 链 ...

  10. shiro【filter】

    alt+7 OncePerRequestFilter public final void doFilter(ServletRequest request, ServletResponse respon ...