小整数池以及字符串驻留机制
小整数池:
在[-5,256]这个区间的整数,在内存中仅仅会存放一份。
举例说明:
在python中,两次重复声明一个内容一样的变量的时候,其id( )是不一样的
但是如果在声明整数的时候,数字是在[-5,256]这个区间的整数,其在内存中就仅仅存放了一份,所以id()是一样的
但是仅仅限于整数,如果是小数则不会触发
字符串驻留(intern)
前面讲了小整数池,在一定范围内的整数,在内存中只会保存一份,所以导致了在[-5,256]范围的数字,就算用不同变量声明,内存中都是指向的同一个地址。
同理,值同样的字符串对象也仅仅会保存一份,是共用的。(这也决定了字符串必须是不可变对象)
但是同小整数池 有区间范围一样,字符串驻留机制也不是 对所有的字符串生效,仅仅是数字、字母或者下划线组成的字符串才存在intern机制
(intern机制仅仅对那些看起来像是Python标识符的字符串对象才会触发)
举例说明:
注意的点:驻留时机 是在编译的时候驻留的,而不是在运行的时候驻留的
举例说明:
上述例子中,'ab'+'c'是在编译的时候求值的,而 变量b + 'c' 是在执行的时候求值的。由于驻留时机是在编译的时候产生,所以b + 'c' 并不会自动去intern
驻留优缺点:
优点:能够提高一些字符串处理任务在时间和空间上的性能,
缺点:在创建或驻留字符串时的会花费更多的时间。
- python标识符的不可变性导致了字符串的改动不是采用replace,而是重新创建对象。为了节省内存,涉及到字符串的改动时通常用join()而非+。因为+会多次创建对象,而join()只创建一次对象。(不推荐使用+来拼接字符串,推荐使用join函数,因为join函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。)其实在比较少的字符串拼接用+反而效率更高,不过如果很多字符串拼接的话还是用join比较合适
- 驻留机制会提升一些时间和空间上的性能,但驻留对象也有所消耗。
以上所有的测试结果都是在命令行中执行得到的,在一些工具中做了优化,比如在pycharm中 a=1000 b=1000 a is b 返回True,这是因为工具的优化导致的