Skip to content

Latest commit

 

History

History
218 lines (156 loc) · 7.97 KB

File metadata and controls

218 lines (156 loc) · 7.97 KB

Seu PyPI custa caro

├── mymath/                     # Pacote Python puro (wheel independente de plataforma)
│   ├── pyproject.toml
│   └── mymath/
│       ├── __init__.py
│       └── operations.py
├── mymath_fast/                # Pacote com extensão em C (wheel específico de plataforma)
│   ├── pyproject.toml
│   ├── setup.py
│   └── mymath_fast/
│       ├── __init__.py
│       └── _native.c
├── mymath_zig/                 # Pacote que compila C usando Zig (wheel específico de plataforma)
│   ├── pyproject.toml
│   ├── setup.py
│   └── mymath_zig/
│       ├── __init__.py
│       └── lib/
│           └── math.c
└── integration/                # App de exemplo simples
    ├── pyproject.toml
    └── main.py

🚀 Início Rápido (5 Minutos)

1. Examine os Wheels construídos

# (Opcional) instale a ferramenta de build
python -m pip install --upgrade build

# Construa os wheels deste repositório
cd mymath && python -m build && cd ..
cd mymath_fast && python -m build && cd ..
cd mymath_zig && python -m build && cd ..

# Compare os tamanhos dos wheels gerados
ls -lh mymath/dist/*.whl mymath_fast/dist/*.whl mymath_zig/dist/*.whl

# Veja o que há dentro de cada wheel
unzip -l mymath/dist/mymath-0.1.0-py3-none-any.whl
unzip -l mymath_fast/dist/mymath_fast-0.1.0-*.whl
unzip -l mymath_zig/dist/mymath_zig-0.1.0-*.whl

2. Teste os Wheels

# Instale e teste o wheel de Python puro
pip install ./mymath/dist/mymath-0.1.0-py3-none-any.whl
python -c "from mymath import add, multiply; print(f'2 + 3 = {add(2, 3)}'); print(f'4 × 5 = {multiply(4, 5)}')"

# Instale e teste o wheel de extensão em C
pip install ./mymath_fast/dist/mymath_fast-0.1.0-*.whl
python -c "from mymath_fast import fast_add, fast_multiply; print(f'2 + 3 = {fast_add(2, 3)} (C)'); print(f'4 × 5 = {fast_multiply(4, 5)} (C)')"

# Instale e teste o wheel que usa Zig para compilar C
pip install ./mymath_zig/dist/mymath_zig-0.1.0-*.whl
python -c "import mymath_zig as mz; print(f'2 + 3 = {mz.add_int(2, 3)} (Zig/C)'); print(f'4 × 5 = {mz.multiply_int(4, 5)} (Zig/C)')"

3. Entenda as principais diferenças

O nome do arquivo do wheel de Python puro: mymath-0.1.0-py3-none-any.whl

  • py3 = Python 3.x
  • none = Sem dependência de ABI
  • any = Funciona em QUALQUER plataforma (Linux, Mac, Windows, etc.)
  • Tamanho: 2 KB

O nome do arquivo do wheel de extensão em C: mymath_fast-0.1.0-cp312-cp312-linux_x86_64.whl

  • cp312 = CPython 3.12 especificamente
  • cp312 = Tag ABI (deve corresponder à compilação do Python)
  • linux_x86_64 = Funciona apenas no Linux x86_64
  • Tamanho: 10 KB (5x maior para um exemplo trivial!)

📖 Caminho de Aprendizado

Nível 1: Compreensão (30 min)

  1. Leia este README e explore os diretórios mymath, mymath_fast e mymath_zig
  2. Examine o código de exemplo nos três pacotes
  3. Construa, instale e teste os wheels (acima)

Nível 2: Construção (1 hora)

  1. Modifique o exemplo de Python puro (adicione novas funções)
  2. Reconstrua: cd mymath && python -m build
  3. Modifique a extensão em C (adicione fast_subtract)
  4. Reconstrua e veja a compilação acontecer

Nível 3: Entendendo o Problema (1 hora)

  1. Entenda o exemplo mymath_zig e como o build com Zig funciona
  2. Concentre-se no "Exemplo de Inchaço (Bloat) do PyPI no Mundo Real"
  3. Entenda por que o numpy precisa de 500 MB por release

Nível 4: Explorando a Solução Zig (2-4 horas)

  1. Instale o Zig: https://ziglang.org/download/
  2. Tente fazer a compilação cruzada de um arquivo C simples
  3. Migre a extensão _native.c para Zig
  4. Faça a compilação cruzada para múltiplos alvos

🎯 O problema central

Em Python com extensões em C, atualmente você faz isso:

# Precisa de uma máquina Linux
docker run --platform linux/amd64 python:3.12 python -m build
docker run --platform linux/arm64 python:3.12 python -m build

# Precisa de uma máquina macOS (não é possível fazer compilação cruzada a partir do Linux)
ssh mac-builder "cd project && python3.12 -m build"

# Precisa de uma máquina Windows (não é possível fazer compilação cruzada a partir do Linux)
ssh windows-builder "cd project && python.exe -m build"

Isso é insano!

Você precisa de mais de 3 máquinas para construir para 3 plataformas, e precisa repetir isso para cada versão do Python (3.8, 3.9, 3.10, 3.11, 3.12, etc).

Com Zig, você poderia fazer isso (a partir de UMA máquina):

zig build-lib native.zig -target x86_64-linux
zig build-lib native.zig -target aarch64-linux
zig build-lib native.zig -target x86_64-macos
zig build-lib native.zig -target aarch64-macos
zig build-lib native.zig -target x86_64-windows
# Tudo construído a partir do seu laptop Linux em < 5 minutos

💡 Por que isso é tão importante?

Usuários

  • Instalações mais rápidas (downloads menores)
  • Menos erros de "falha na compilação"
  • Mais plataformas suportadas (IoT, sistemas embarcados, etc.)

Mantenedores de Pacotes

  • CI/CD mais simples (uma máquina em vez de 3-5)
  • Releases mais rápidas (5 min em vez de 2 horas)
  • Custos mais baixos (redução de 80% no uso de CI/CD)

PyPI

  • Custos de armazenamento mais baixos (redução de 40-70%)
  • Custos de largura de banda mais baixos
  • Melhor sustentabilidade

Ecossistema

  • Incentiva mais extensões em C (mais fáceis de distribuir)
  • Melhor suporte cross-platform
  • Moderniza as ferramentas do Python

🛠️ Seus próximos passos

Imediato (Hoje)

  1. ✅ Entender o que são wheels (leia este README)
  2. ✅ Ver o problema do inchaço em primeira mão (compare os tamanhos dos wheels)
  3. ⬜ Testar os wheels construídos

Curto Prazo (Esta Semana)

  1. ⬜ Instalar o Zig
  2. ⬜ Migrar a extensão C para Zig
  3. ⬜ Fazer a compilação cruzada para múltiplos alvos
  4. ⬜ Comparar tamanhos de binários e tempos de construção

Médio Prazo (Este Mês)

  1. ⬜ Escolher um pacote PyPI real, mas simples, com extensões em C
  2. ⬜ Criar uma ferramenta de construção baseada em Zig para ele
  3. Benchmark: tempo de construção, tamanho do binário, desempenho em tempo de execução
  4. ⬜ Documentar as descobertas

Longo Prazo (3+ Meses)

  1. ⬜ Escrever uma PEP (Python Enhancement Proposal)
  2. ⬜ Construir apoio da comunidade
  3. ⬜ Criar ferramentas para adoção mais ampla
  4. ⬜ Trabalhar com pacotes principais (numpy, scipy, pandas)

📚 Recursos Adicionais

Aprofundamentos em empacotamento Python

Recursos Zig

🎓 TLD

Wheel: Um pacote Python pré-compilado (como um .deb ou .rpm para Python)

Wheel específico para plataforma: Contém código C/C++/Rust compilado, funciona apenas em OS/arquitetura específicos

Inchaço (Bloat) do PyPI: Resultado da necessidade de wheels separados para cada combinação de Versão do Python × OS × Arquitetura

Compilação cruzada (Cross-compilation): Construir para a Plataforma B enquanto está na Plataforma A (Zig se destaca nisso)

Construção Hermética (Hermetic build): Construção reproduzível que não depende do estado do sistema hospedeiro (Zig oferece isso)