0Pricing
Python Academy · Aula

Contagem de referências do CPython

Entenda como o CPython acompanha os ciclos de vida dos objetos com contadores de referências.

Contagem de referências do CPython é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.

O que é contagem de referências?

O CPython acompanha a contagem de referências de cada objeto. Quando a contagem chega a 0, o objeto é desalocado imediatamente. Esse é o principal mecanismo de gerenciamento de memória do Python.

import sys

x = [1, 2, 3]
print(sys.getrefcount(x))   # 2 (x + getrefcount arg)
y = x
print(sys.getrefcount(x))   # 3

sys.getrefcount()

sys.getrefcount(obj) retorna a contagem de referências atual. Observação: chamá-la adiciona 1 (a referência do argumento da função).

import sys

a = "hello"
print(sys.getrefcount(a))   # baseline (may be high for interned strings)

b = a
print(sys.getrefcount(a))   # one more
del b
print(sys.getrefcount(a))   # back to baseline

Incremento e decremento

Cada atribuição incrementa a contagem; cada exclusão ou reatribuição a decrementa. Quando a contagem chega a 0, o CPython chama o desalocador do objeto.

x = []          # refcount = 1
y = x           # refcount = 2
z = [x]         # refcount = 3  (list holds a reference)
del y           # refcount = 2
z.clear()       # refcount = 1
del x           # refcount = 0 → deallocated

Internação de objetos

O CPython interna números inteiros pequenos (-5 a 256) e muitos literais de texto, reutilizando o mesmo objeto. As comparações com is revelam esse comportamento.

a = 256
b = 256
print(a is b)   # True (interned)

c = 257
d = 257
print(c is d)   # may be False (not interned)

Referências fracas

Referências fracas não incrementam a contagem de referências. Elas são úteis para evitar impedir a coleta de lixo de objetos que você deseja observar, mas não possuir.

import weakref

class BigObject:
    pass

obj = BigObject()
ref = weakref.ref(obj)
print(ref())   # <BigObject instance>
del obj
print(ref())   # None (object was collected)

Ciclos de referências

Se A referencia B e B referencia A, nenhum dos dois chega a 0, mesmo quando ambos estão inacessíveis. O GC cíclico do CPython detecta e coleta esses ciclos.

a = []
b = [a]
a.append(b)   # cycle: a → b → a
del a, b
# Both are unreachable but refcount > 0
# The cyclic GC collects them

O módulo gc

O módulo gc fornece o coletor de lixo cíclico. Ele é executado automaticamente, mas pode ser acionado manualmente ou desativado.

import gc

gc.collect()   # force a collection cycle
print(gc.get_count())    # (gen0, gen1, gen2) allocation counts
print(gc.get_threshold())  # when each generation is collected

Pools de memória (pymalloc)

O CPython aloca objetos pequenos (< 512 bytes) a partir de seu próprio pool de memória (pymalloc), que é mais rápido do que chamar malloc para cada objeto pequeno.

# You do not call pymalloc directly — CPython uses it internally
# for all Python-level object allocations

# The pool pre-allocates large memory arenas
# and carves them into pools of fixed-size blocks

Finalizadores __del__

__del__ é chamado quando a contagem de referências de um objeto chega a 0 (ou posteriormente, se ele estiver em um ciclo). Evite depender dele para a limpeza crítica — utilize gerenciadores de contexto.

class Resource:
    def __del__(self):
        print(f"Freeing {self}")

# Better: use context manager
class SafeResource:
    def __enter__(self): return self
    def __exit__(self, *a): self.cleanup()

Objetos compactos com __slots__

Objetos com __slots__ usam menos memória e exigem menos alocações, reduzindo a pressão sobre o GC.

import sys

class Reg:
    def __init__(self, x, y): self.x, self.y = x, y

class Slotted:
    __slots__ = ("x","y")
    def __init__(self, x, y): self.x, self.y = x, y

print(sys.getsizeof(Reg(1,2)))      # ~48 + dict overhead
print(sys.getsizeof(Slotted(1,2)))  # ~48 (no dict)

Desativação do GC cíclico

Para programas que não criam ciclos de referências, desativar o GC cíclico pode melhorar a vazão.

import gc

gc.disable()   # no cyclic GC — objects are only freed by refcounting

# Use only if you KNOW no cycles are created
# (pure functional/immutable data)

gc.enable()    # re-enable

Verificação rápida

Quando o CPython desaloca imediatamente um objeto?

Recapitulação

O CPython acompanha os objetos por meio de contagens de referências. Quando a contagem chega a 0 → desalocação imediata. Os ciclos de referências são tratados pelo GC cíclico (módulo gc). Evite __del__ para limpeza crítica; utilize gerenciadores de contexto. Utilize __slots__ para reduzir a memória por objeto.

Perguntas Frequentes

A aula “Contagem de referências do CPython” é grátis?

Sim — o texto completo de “Contagem de referências do CPython” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.

O que vou aprender em “Contagem de referências do CPython”?

Entenda como o CPython acompanha os ciclos de vida dos objetos com contadores de referências. Você pratica Python Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Python Academy?

Nenhuma experiência prévia é necessária. Python Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Contagem de referências do CPython”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Python Academy?

Sim. Cada aula de Python Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Contagem de referências do CPython
  2. O coletor de lixo e referências cíclicas
  3. Criação de perfis com cProfile e line_profiler
  4. Criação de perfis de memória com tracemalloc
← Voltar para Python Academy