2011-09-25 23 views
5

Dlaczego„sys.getrefcount()” wartość zwracana

sys.getrefcount() 

powrót 3 dla każdej dużej liczby lub prosty ciąg? Czy to znaczy, że 3 obiekty przebywać gdzieś w programie? Również, dlaczego nie ustalone x = (bardzo duża liczba) zwiększa liczbę ref. tego obiektu? Czy te 3 wartości referencji wynikają z mojego wywołania getrefcount? Dziękujemy za wyjaśnienie tego.

na przykład:

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

Chociaż x = "testowanie" zwiększa liczbę powtórzeń, x = (duża liczba) nie. – kaiseroskilo

Odpowiedz

9

Duże obiekty całkowitymi nie są ponownie wykorzystywane przez tłumacza, więc masz dwa różne obiekty:

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

sys.getrefcount (11111) zawsze zwraca ten sam numer, ponieważ mierzy liczbę odwołań świeżego obiekt.

Dla małych liczb całkowitych, Python zawsze ponownie używa tego samego obiektu:

>>> sys.getrefcount(1) 
73 

Zazwyczaj można dostać tylko jedno odniesienie do nowego obiektu:

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

Ale całkowitymi są przydzielane w specjalnym przed- malloced area by Python dla optymalizacji wydajności i podejrzewam, że dodatkowe dwa odwołania mają coś wspólnego z tym.

Możesz zajrzeć na realizację C tutaj: http://svn.python.org/view/python/trunk/Objects/intobject.c?view=markup

EDIT: Nie twierdzę, aby zrozumieć, co się dzieje w lowlevel szczegółów, myślę, że istnieje kilka rzeczy, w pracy, że cache tymczasowe nazwy:

print sys.getrefcount('foo1111111111111' + 'bar1111111111111') #1 
print sys.getrefcount(111111111111 + 2222222222222)   #2 
print sys.getrefcount('foobar333333333333333333')    #3 
6
  1. Małe smyczki i całkowitymi są buforowane przez Python, aby zaoszczędzić na kosztach budowy obiektu.

  2. Interaktywny interpreter języka Python przechowuje tymczasowe odwołanie do każdego wprowadzanego literału. Porównaj getrefcount('foobar') z getrefcount('foo' + 'bar'). (W tym ostatnim przypadku, interpreter ma odniesień do 'foo' i 'bar'.)

  3. Z manual:

Ilość zwrócony jest na ogół jeden wyższy niż można się było spodziewać, ponieważ zawiera (tymczasowy) odniesienie jako argument do getrefcount().

+0

Tak więc jest 1 dla pamięci podręcznej + 1 dla tymczasowego ref.What o trzecim? Czy to należy do wewnętrznych Pythona? – kaiseroskilo

+2

@kaiseroskilo: nie, to +2 dla tymczasowych odniesień; jeden w interaktywnym tweenvel i jeden w samym 'getrefcount', ponieważ obiekt jest przekazywany jako argument. –

+0

Ok, otrzymuję to teraz! Dzięki! – kaiseroskilo

Powiązane problemy