Python3 notas de estudio _F (recolección de basura)


Código de notas se puede ejecutar en Jupyter cuaderno (experiencia de realidad Jupyter-lab es grande).

Recomendado para no ver, para ser más manos para golpear código. Ojo más de un millar era mejor a la mano leyó de nuevo.

Júpiter ejecutar código notas relacionadas se han cargado, descargado de sus propios recursos.

La recolección de basura

Referencia URL: https: //www.cnblogs.com/jin-xin/articles/9439483.html

resumen:

同一代码块下:缓存机制
不同代码块:小数据池

bloque

Un módulo, una función, una clase, un archivo es un bloque de código.

En la línea de comandos interactiva, un comando es un bloque de código.

bloque de código almacenamiento en caché

En Run Python mismo bloque de código de inicialización de destino,

Comprueba si el valor ya existe, si lo hay, se pueden volver a utilizar.

En otras palabras:

执行同一个代码块时,遇到初始化对象的命令时,

他会将初始化的这个变量与值存储在一个字典中,

在遇到新的变量时,会先在字典中查询记录,

如果有同样的记录那么它会重复使用这个字典中的之前的这个值。

Si cumplen existe el mecanismo de almacenamiento en caché en la memoria sólo una, a saber: el mismo id.

Ámbito bloques de almacenamiento en caché de código: int (float), str, bool.

int(float):任何数字在同一代码块下都会复用。

bool:True和False在字典中会以1,0方式存在,并且复用。

str:几乎所有的字符串都会符合缓存机制
        
        1,非乘法得到的字符串都满足代码块的缓存机制
        
        2,乘法得到的字符串分两种情况:

              2.1 乘数为1时,任何字符串满足代码块的缓存机制:
                
              2.2 乘数>=2时:仅含大小写字母,数字,下划线,
              总长度<=20,满足代码块的缓存机制

ventajas:

能够提高一些字符串,整数处理人物在时间和空间上的性能;
需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁创建和销毁,提升效率,节约内存。
'''jupyter这里运行存在问题,以注释为主'''

# 字符串缓存机制 例子

# 非乘法得到的字符串
def unMult():
    s1 = 'string'
    s2 = 'string'
    print('非乘法得到的字符串')
    print('*'*30)
    print('s1和s2地址比较:',id(s1) == id(s2)) # True
    print('*'*30)

# 乘数为1得到的字符串
def multOne():
    s3 = 'asdf!@#$%^*'*1
    s4 = 'asdf!@#$%^*'*1
    print('乘数为1得到的字符串')
    print('*'*30)
    print('s3和s4地址比较:',id(s3) == id(s4)) # True
    print('*'*30)
   
# 乘数>=2时
def multMore():
    s3 = 'adf!'*4 # 包含其他字符,总长<20
    s4 = 'adf!'*4
    s5 = 'qwertyuiop[]asdfghjk!@#$%^&'*4
    # 包含其他字符,总长>20
    s6 = 'qwertyuiop[]asdfghjk!@#$%^&'*4
    s7 = 'asdf_asdf'*3 # # 不包含其他字符,总长<20
    s8 = 'asdf_asdf'*3
    
    print('乘数为>=2,总长度<=20,包含其他字符得到的字符串')
    print('*'*30)
    print('s3和s4地址比较:',id(s3) == id(s4)) # False
    print('*'*30)
    
    print('乘数为>=2,总长度>20,包含其他字符得到的字符串')
    print('*'*30)
    print('s5和s6地址比较:',id(s5) == id(s6)) # False
    print('*'*30)
    
    print('乘数为>=2,总长度<=20,不包含其他字符得到的字符串')
    print('*'*30)
    print('s7和s8地址比较:',id(s7) == id(s8)) # True
    print('*'*30)
    
# test
unMult()
multOne()
multMore()
非乘法得到的字符串
******************************
s1和s2地址比较: True
s1和s2来源比较: True
******************************
乘数为1得到的字符串
******************************
s3和s4地址比较: True
s3和s4来源比较: True
******************************
乘数为>=2,总长度<=20,包含其他字符得到的字符串
******************************
s3和s4地址比较: True
s3和s4来源比较: True
******************************
乘数为>=2,总长度>20,包含其他字符得到的字符串
******************************
s5和s6地址比较: True
s5和s6来源比较: True
******************************
乘数为>=2,总长度<=20,不包含其他字符得到的字符串
******************************
s7和s8地址比较: True
s7和s8来源比较: True
******************************

piscina pequeña de datos

premisa:

小数据池也是只针对 int(float),str,bool。

小数据池是针对不同代码块之间的缓存机制!!!

Python automáticamente número entero -5-256 se almacena en caché,

Al asignar estas variables enteras, y no va a volver a crear el objeto,

Pero el uso de caché de objetos ha sido creado.

cadena de Python será ciertas reglas en la cadena para crear una piscina reside.

'''小数据池例子'''

# 整数
a = 100
b = 100
c = 123456
d = 123456

print('id(a) == id(b): ',id(a) == id(b))
print('id(c) == id(d): ',id(c) == id(d))

id(a) == id(b):  True
id(c) == id(d):  False

Especificar el Parque

# 指定驻留 例子
from sys import intern

a = 'asd*&'*3
b = 'asd*&'*3

print('未指定驻留:a is b:', a is b)
print(id(a))
print(id(b))

c = intern('asd*&'*3)
d = intern('asd*&'*3)

print('指定驻留:c is d:', c is d)
print(id(c))
print(id(d))
未指定驻留:a is b: False
139839647396976
139839643255088
不未指定驻留:c is d: True
139839642805680
139839642805680

contador de referencias

Python cuenta de referencia principalmente a:

引用计数优点:简单,实时性

引用计数缺点:维护时占用内存,循环引用,造成内存泄漏

引用计数减一不止del,还可以透过赋值None

la recuperación intergeneracional

Ruby中的垃圾回收是标记清除,对内存的申请是一次申请多个,
当内存不够用时再清理,而Python中的内存申请是用一个申请一个。

Intergeneracional suplemento de recuperación:

零代链表中检测到相互循环引用的减一,得到是否是垃圾(引用计数为0),需要回收,否则不会减一
módulo de GC
'''
gc.get_count():获取当前自动执行垃圾回收的计数器

返回一个元组(x,y,z)
参数解释:
[
x 表示内存占用,
y 表示零代清理次数,
z 同理表示1代清理次数
]


gc.get_threshold() 获取的gc模块中自动执行垃圾回收的频率

返回(x,y,z) 

参数解释:
[
x表示清理上限,
y表示每清理零代链表10次,
清理一次 1 代链表。
z同理是1,2代 这里的x,y,z默认值为(700,10,10)
]

查看一个对象的引用计数:

sys.getrefcount()

gc.disable() 关闭Python的gc

gc.enable() 开启gc

gc.isenabled() 判断是否是开启gc的

gc.collect([generation])显式进行垃圾回收(手动回收)

可以输入参数:
[
0代表只检查第一代的对象,

1代表检查一,二代的对象,

2代表检查一,二,三代的对象,
如果不传参数,执行一个full collection,也就是等于传2。
]


注意:
尽量不要手动重写对象的__del__方法,
因为重写后会使删除时不会自动调用gc来删除,
此时需要调用父类的__del__()来删除
'''

# gc 引用计数 示例
import gc, sys

a = 1
get_a_c = sys.getrefcount(a)
b = a
get_b_c = sys.getrefcount(a)

gc_c = gc.get_count()
gc_t = gc.get_threshold()

gc.disable()
gc.enable()

gc_is = gc.isenabled()

gc_cl = gc.collect(2)

print(get_a_c, get_b_c, gc_c, gc_t, gc_is, gc_cl)
2275 2275 (603, 5, 0) (700, 10, 10) True 921
Publicado 13 artículos originales · ganado elogios 0 · Vistas 24

Supongo que te gusta

Origin blog.csdn.net/qq_34764582/article/details/104940477
Recomendado
Clasificación