variables de Python mecanismo de memoria

Como un fácil utilizar el lenguaje y con grandes bibliotecas, pitón puede ser descrito como un programador en manos del tamaño de la palma, la programación en sí es una mente humana reformada está pensando en la tecnología informática, si no a la búsqueda de la máxima eficiencia operativa, al mismo tiempo no se limita a la memoria del ordenador, pitón es, sin duda, el lenguaje más conveniente.

Como programadores cualificados, que, naturalmente, tenemos que conocer estos y saber por qué, además de usar Python para volar más allá del yo, sino también para explorar el interior de la pitón su principio de funcionamiento, los más afectados por la programación Python se debe utilizar para las variables y operar el mecanismo detrás de él.

Nota: En el siguiente ejemplo escrito en la plataforma Linux, utilizando python2.7

mecanismo de referencia

variables de Python - modelo de memoria es más como mecanismo de C ++ referencias, pitón cada variable puede no tener espacio en la memoria, más como una referencia a la variable de memoria, se puede acceder a los datos en la memoria por esta variable, dan ejemplos:

>>>a=10
>>>b=a
>>>c=[1,2,3,4]
>>>d=c
>>>print "%x%x"  %(id(a),id(b))
>>>print "%x%x"  %(id(c),id(d))

salida:

b51080.b51080
7f28bf69b758.7f28bf69b758  

Donde id () es una función del sistema de pitón devuelve la memoria de objeto a partir de direcciones.

De los resultados, a y b, c y d que corresponde a la dirección de la variable es de hecho la misma dirección, que es cuando usamos las variables A y B, utilizan el mismo objeto, y a, b son objeto referencia, podemos () para ver un objeto a través del número de referencia sys.getrefcount función del sistema:

>>>import sys
>>>a=257
>>>print sys.getrefcount(a)
>>>b=a
>>>print sys.getrefcount(a)

salida:

2
3

Obviamente, esto no se traduce en nuestras expectativas de ellos, debido a la a y b en la misma dirección, el resultado debería ser 1,2, 2,3 ¿Por qué es?

Esto se debe a sys.getrefcount () llamada a la función, un también ha sido citado como argumento una vez, por lo que da como resultado 2,3.

Pequeño mecanismo de almacenamiento en caché de datos

Hemos mencionado mecanismo de memoria por encima cuando la asignación de variables pitón, las cosas son final tan perfecto?

Y no! ! !

Veamos un ejemplo:

>>> a=10
>>> b=10
>>> print "%x.%x" %(id(a),id(b))

salida:

b51080.b51080

Ver los resultados, poco a poco me quité las gafas, tener el 95% de la concentración de alcohol médico limpie con cuidado tres veces y luego se puso después de ver, no está mal! Estas dos variables se refieren a la misma dirección o el contenido, esta vez para inicializar las dos variables son independientes, la cesión no se ha inicializado, o por qué las dos variables se refieren a la misma dirección que?

La respuesta es:

在Python中,Python会有一个缓存对象的机制,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象,以达到节省资源的目的  

Así que esto es! ! !

Pero pensar con cuidado, no lo hace, ¿verdad? Si cada una caché de datos, esto significaría que los residuos extremo del espacio de memoria? O mecanismo de recuperación de la memoria se recuperará durante un período de tiempo una vez que la memoria de la basura?
Veamos un ejemplo:

>>> a=100
>>> b=100
>>> print "%d%d" %(id(a),id(b))
>>> a=256
>>> b=256
>>> print "%d%d" %(id(a),id(b))
>>> a=257 
>>> b=257
>>> print "%d%d" %(id(a),id(b))

salida:

5223836.5223836
5225932.5225932
5241840.5241864  

A partir de los resultados, cuando A es menos de 256, este valor será caché del sistema de reciclado, y cuando a> 256, el sistema de caché no es (por supuesto, sólo el resultado de tres experimentos, los bloggers también trataron muchos subsecuente valor, no a la lista)

Venimos otra manera de comprobar este problema, a saber sys.getrefcount ():

>>>import sys
>>>a=10
>>>print sys.getrefcount(a)
>>>a=257
>>>print sys.getrefcount(a)

La salida es:

15
2

El resultado es obvio, este valor es la caché del sistema 10, y en otros lugares una serie de referencias, y el valor de 2 257 (2 ¿Por qué lugar se explican en el anterior 1)

Así que la pregunta de nuevo, si otros tipos de datos que? Vemos entonces

>>>a="downey"
>>>b="downey"
>>>print "%d%d" %(id(a),id(b))

Los resultados son los siguientes:

39422528.39422528

Habrá un mecanismo de almacenamiento en caché de cadena corta

A continuación la lista:

>>>a=[1,2,3]
>>>b=[1,2,3]
>>>print "%d%d" %(id(a),id(b))
39704576.39745176

lista y ningún mecanismo de almacenamiento en caché, desde aquí se puede ver, los mecanismos de almacenamiento en caché pitón no son para todos los tipos de variables

Conclusión variable de caché

De acuerdo con diversas investigaciones y experimentos muestran, los resultados mostraron que:

  • variable de pitón es en realidad una referencia a la memoria de pila, la etiqueta puede ser entendido como una entidad, y la copia de la copia (por ejemplo, a = b) entre las diferentes variables, los objetos están representados por la misma entidad
  • pitón será -5-256 (incluyendo el 256) y una cadena corta de la memoria caché de datos entero con el fin de guardar la sobrecarga de destrucción distribución múltiple

Vea aquí, al igual que el pensamiento de mis amigos no pueden dejar de querer preguntar, y almacena en caché datos enteros estas cadenas cortas realmente han mejorado significativamente el rendimiento de la misma? código Python puede tener un número de variables enteras?

La respuesta es: un número entero que corresponde a un objeto de memoria variable de número entero, pero el objeto no es sólo una memoria entero correspondiente al número entero tipo de variable, el recipiente también puede ser una conformación elemento número entero referencias a variables

Si todavía tiene dudas, que echar un vistazo al siguiente ejemplo:

>>> import sys
>>> a=1
>>> sys.getrefcount(a)
128
>>> b=[1,2,3]
>>> sys.getrefcount(a)
129

De los resultados de la impresión, la variable de número entero a = 1, 1 indica un objeto de puntero, como referencia 1, b [0] son ​​también inicializa a 1, de la misma, b [0] es también una referencia al objeto 1, para todos los contenedores son de esta forma, ver aquí, señoras y caballeros de la audiencia debe ser una comprensión de la misma.

Sobre pitón variables afectan el mecanismo de las variables de memoria puede referirse a esta entrada del blog: Cuando el parámetro llamada a la función que pasa pitón

La recolección de basura

Ahora viene el mecanismo de memoria, el mecanismo debe implicar la distribución y recuperación de asignación de memoria es muy simple, cuando se utiliza en la definición de la memoria asignada objeto, y el reciclaje de memoria no es tan simple, porque en el proceso de recuperación de la memoria, Python no puede realizar otras tareas, por lo que la recolección de basura frecuente puede causar serios problemas de eficiencia, y el intervalo de recuperación de la memoria es demasiado larga puede conducir a la gran pérdida de la memoria, por lo general sólo se inicia la recolección de basura dentro de un tiempo específico.

carreras pitón, y el número de liberación asignación registrada, sólo cuando la diferencia entre los dos valores es mayor que un cierto valor, es decir,

分配次数-释放次数>触发回收的阈值

Cuando, recolección de basura pitón, podemos utilizar el método get_threshold () para obtener el umbral:

>>>import gc
>>>print gc.get_threshold()

salida:

(700,10,10)

El 700 es el umbral de activación de la memoria recuperada. Sin embargo, dos de 10 en ese entonces, ¿qué significa?

También es un mecanismo para la recuperación de la memoria, llamada recuperación generacional, supuesto básico de esta estrategia es: cuanto mayor sea el tiempo que el objeto existe, al menos propensos a convertirse en objetos de basura que dan uso de algunos de los objetos más confianza a largo plazo.

Python 0,1,2 todos los sujetos fueron divididos en tres generaciones. Todos los objetos son de nueva generación 0 objetos. Cuando un objeto es recogida generación de basura con experiencia, aún con vida, entonces se clasifica como el próximo objetivo. Cuando se inicia la recolección de basura, se explorará todos los objetos de la generación 0. Si la generación 0 recolección de basura después de un cierto número de veces, y luego iniciar el escaneo y limpieza de la generación y la generación 0 1. Cuando una generación ha pasado por un cierto número de recolección de basura, que comenzará a 0,1,2, que escanea todos los objetos

Es decir, dos veces la get_threshold anteriormente ((700, 10, 10) dos 10 vuelve devuelto). En otras palabras, cada generación 10 0 recolección de basura, se reunirá una vez por generación de recolección de basura 1, y la recolección de basura cada 10 generación, tendrá 1 2 generación de recolección de basura.

También podemos ajustar manualmente el umbral de activación de la recuperación, amigos inteligentes pueden adivinar este método, y puesto que hay get, está unido al conjunto correspondiente:

import gc
gc.set_threshold(600,8,7)

Además de esperar pasivamente a que la recuperación del sistema, por supuesto, se puede realizar de forma manual recuperación de la memoria:

import gc
gc.collect()  

De hecho, Ye Hao Java, Python o, mecanismos de la memoria cada idioma afectarán fundamentalmente la eficiencia de la lengua, por lo que habrá mucho más intrincados detalles sobre el proceso de la memoria, introducidos aquí solamente un marco general para la transgresión , dio la bienvenida a la aprobación de la gran Dios que las correcciones y adiciones.

Pues bien, el problema sobre el mecanismo de la memoria de variables de pitón a parar aquí, si mis amigos o tienen alguna pregunta para este artículo encontrado en lo que está mal, mensaje de bienvenida

Personal E-mail: [email protected]
original del blog, por favor indique la fuente!

Le deseo una pronta realización del proyecto a través de la espesura, fallo no hace Zhanshen.
(Fin)

Publicados 296 artículos originales · ganado elogios 221 · vistas 540 000 +

Supongo que te gusta

Origin blog.csdn.net/qq_36387683/article/details/104988710
Recomendado
Clasificación