2011-09-25 26 views
5

¿Por qué"sys.getrefcount()" valor de retorno

sys.getrefcount() 

de retorno 3 para cada gran número o una cadena simple? ¿Eso quiere decir que 3 objetos residen en alguna parte del Programa? Además, ¿por qué no establecer x = (número muy grande) ¿Aumenta el recuento de ref de ese objeto? ¿Estos recuentos de 3 ref resultan de mi llamada a obtener una cuenta? Gracias por aclarar esto.

por ejemplo:

>>> sys.getrefcount(4234234555) 
3 
>>> sys.getrefcount("testing") 
3 
>>> sys.getrefcount(11111111111111111) 
3 
>>> x=11111111111111111 
>>> sys.getrefcount(11111111111111111) 
3 
+0

Aunque x = "prueba" aumenta el recuento de ref, x = (gran número) no lo hace. – kaiseroskilo

Respuesta

9

objetos de enteros grandes no son reutilizados por el intérprete, para que tenga dos objetos distintos:

>>> a = 11111 
>>> b = 11111 
>>> id(a) 
40351656 
>>> id(b) 
40351704 

sys.getrefcount (11111) siempre devuelve el mismo número, ya que mide el número de referencias de un fresco objeto.

Para enteros pequeños, Python siempre se vuelve a utilizar el mismo objeto:

>>> sys.getrefcount(1) 
73 

Por lo general, se podrían obtener sólo una referencia a un objeto nuevo:

>>> sys.getrefcount(object()) 
1 

Pero enteros se asignan en un pre-especial área mal delimitada por Python para la optimización del rendimiento, y sospecho que las dos referencias adicionales tienen algo que ver con esto.

Usted puede mirar en la implementación en C aquí: http://svn.python.org/view/python/trunk/Objects/intobject.c?view=markup

Editar: No pretendo entender lo que está pasando en los detalles de bajo nivel, creo que hay varias cosas en el trabajo esa caché referencias temporales:

print sys.getrefcount('foo1111111111111' + 'bar1111111111111') #1 
print sys.getrefcount(111111111111 + 2222222222222)   #2 
print sys.getrefcount('foobar333333333333333333')    #3 
6
  1. pequeñas cadenas y enteros se almacenan en caché por Python para ahorrar en el costo de construcción de objetos.

  2. El intérprete interactivo de Python guarda una referencia temporal a cada literal que ingrese. Comparar getrefcount('foobar') con getrefcount('foo' + 'bar'). (En este último caso, el intérprete tiene referencias a 'foo' y 'bar'.)

  3. Desde el manual:

El número devuelto es generalmente uno más alto que se puede esperar, ya que incluye la (temporal) de referencia como argumento al getrefcount().

+0

Así que es 1 para el caché + 1 para la referencia temporal. ¿Y el tercero? ¿Pertenece al interior de Python? – kaiseroskilo

+2

@kaiseroskilo: no, es +2 para referencias temporales; uno en el nivel superior interactivo, y uno en 'getrefcount' en sí porque el objeto se pasa como un argumento. –

+0

Ok, lo entiendo ahora! Gracias! – kaiseroskilo