0% acharam este documento útil (0 voto)
3 visualizações25 páginas

Python Vs Rust Streaming

O documento compara o streaming de dados em Python e Rust, destacando como ambas as linguagens lidam com a leitura e processamento de dados. Em Python, utiliza-se iteradores e generators, enquanto Rust oferece controle e segurança através de iterators e conceitos de ownership. Além disso, o texto aborda a diferença entre streaming síncrono e assíncrono, enfatizando as vantagens de Rust em termos de performance e segurança.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
3 visualizações25 páginas

Python Vs Rust Streaming

O documento compara o streaming de dados em Python e Rust, destacando como ambas as linguagens lidam com a leitura e processamento de dados. Em Python, utiliza-se iteradores e generators, enquanto Rust oferece controle e segurança através de iterators e conceitos de ownership. Além disso, o texto aborda a diferença entre streaming síncrono e assíncrono, enfatizando as vantagens de Rust em termos de performance e segurança.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

11/03/2026, 12:49 Python vs Rust Streaming

ChatGPT 5.4 Thinking Memória desativada

Sou programador Python aprendendo Rust, tenha ótima


didática e faça correlação entre as linguagens, mostre
como o rust trabalha comSou programador Python
aprendendo Rust, tenha ótima didática e faça correlação
entre as linguagens, mostre como o rust trabalha com
Streaming de dados

Pensou por 4 segundos

Perfeito. Vou te explicar Rust com foco em streaming de dados, sempre fazendo ponte
com Python, porque esse é o jeito mais rápido de você construir intuição sólida.

Visão geral
Quando você fala em streaming de dados, isso pode significar algumas coisas:
1. Ler dados aos poucos, sem carregar tudo na memória
Ex.: ler um arquivo grande linha por linha.
2. Processar dados contínuos
Ex.: mensagens chegando de socket, Kafka, serial, stdin, API, sensor IoT.
3. Transformar dados em pipeline
Ex.: filtrar, mapear, agregar, encaminhar.

Em Python, isso normalmente aparece com:


iteradores
generators ( yield )
asyncio

leitura de arquivos e sockets

Em Rust, isso aparece com:

Iterator

Read , BufRead

canais ( std::sync::mpsc , tokio::sync::mpsc )


async/.await

Stream com tokio-stream ou futures

[Link] 1/25
11/03/2026, 12:49 Python vs Rust Streaming

1. Primeiro paralelo mental: Python vs Rust


Python
Em Python, streaming costuma ser natural porque muita coisa já é iterável:

Python Executar

with open("[Link]", "r", encoding="utf-8") as f:


for linha in f:
print([Link]())

Aqui você já está processando em streaming:


o arquivo não precisa ser carregado inteiro.

Você também pode criar um gerador:

Python Executar

def numeros():
for i in range(10):
yield i

Rust
Em Rust, a ideia é parecida, mas com mais controle e segurança:

Rust

for i in 0..10 {
println!("{}", i);
}

Para leitura de arquivo em streaming:

Rust

use std::fs::File;
use std::io::{self, BufRead, BufReader};

fn main() -> io::Result<()> {


let file = File::open("[Link]")?;
let reader = BufReader::new(file);

for line in [Link]() {


let line = line?;

[Link] 2/25
11/03/2026, 12:49 Python vs Rust Streaming

println!("{}", line);
}

Ok(())
}

2. O que muda mentalmente do Python para Rust


Em Python
Você pensa:
“isso funciona?”
“a estrutura é iterável?”
“vou consumir isso com for ?”

Em Rust
Você pensa:
“quem é o dono desse dado?”
“estou emprestando ou movendo?”
“esse fluxo é síncrono ou assíncrono?”
“quero processar item por item ou em blocos?”

Essa diferença é crucial.

3. Streaming síncrono em Rust


Vamos começar do jeito mais simples.

Exemplo: ler arquivo linha por linha

Python

Python Executar

with open("[Link]", "r", encoding="utf-8") as f:


for linha in f:
if "ERROR" in linha:
print([Link]())

Rust

[Link] 3/25
11/03/2026, 12:49 Python vs Rust Streaming

Rust

use std::fs::File;
use std::io::{self, BufRead, BufReader};

fn main() -> io::Result<()> {


let file = File::open("[Link]")?;
let reader = BufReader::new(file);

for line in [Link]() {


let line = line?;
if [Link]("ERROR") {
println!("{}", line);
}
}

Ok(())
}

Correlação direta
open(...) em Python ↔ File::open(...) em Rust
for linha in f ↔ for line in [Link]()

if "ERROR" in linha ↔ if [Link]("ERROR")

4. Iterator: a base do streaming em Rust


Em Rust, Iterator é uma das peças centrais.

Python

Python Executar

nums = [1, 2, 3, 4, 5]
resultado = [x * 2 for x in nums if x % 2 == 0]
print(resultado)

Rust

Rust

fn main() {
let nums = vec![1, 2, 3, 4, 5];

let resultado: Vec<i32> = nums


.iter()

[Link] 4/25
11/03/2026, 12:49 Python vs Rust Streaming

.filter(|x| **x % 2 == 0)
.map(|x| x * 2)
.collect();

println!("{:?}", resultado);
}

O ponto importante
Em Rust, o pipeline de transformação funciona muito bem para streaming:

iter()
filter()

map()

take()

skip()
collect()

Mas existe uma diferença importante:

Em Python
As comprehensions normalmente geram resultado final logo de uma vez.

Em Rust
Os iterators são lazy, isto é, preguiçosos.
Eles só processam quando você consome o fluxo.

Isso é excelente para streaming.

5. Lazy evaluation: muito importante


Rust

Rust

fn main() {
let nums = vec![1, 2, 3, 4, 5];

let iter = [Link]().map(|x| {


println!("processando {}", x);
x * 2
});

println!("nada aconteceu ainda");

[Link] 5/25
11/03/2026, 12:49 Python vs Rust Streaming

for v in iter {
println!("resultado {}", v);
}
}

O que isso ensina?


O map() não executa na hora.
Ele só executa quando o iterator é consumido no for .

Em Python, comparação mental


Isso lembra:

Python Executar

gen = (x * 2 for x in [1, 2, 3, 4, 5])

Esse generator também é lazy.

Então a melhor ponte mental é:

Rust Iterator se parece mais com generator/composição lazy de Python


e menos com uma lista pronta

6. Ownership no streaming: onde Python e Rust mais


diferem
Aqui está uma das maiores viradas de chave.

Python
Python passa referências de forma bem flexível.
Você quase nunca precisa pensar explicitamente em “quem possui o dado”.

Rust
No streaming, isso importa o tempo todo.

Exemplo:

Rust

fn main() {
let nomes = vec!["ana".to_string(), "bia".to_string(), "caio".to_string()];
[Link] 6/25
11/03/2026, 12:49 Python vs Rust Streaming

for nome in nomes {


println!("{}", nome);
}

// println!("{:?}", nomes); // erro: nomes foi movido


}

Por quê?
Porque o for nome in nomes consumiu o vetor.

Se você quiser apenas emprestar:

Rust

fn main() {
let nomes = vec!["ana".to_string(), "bia".to_string(), "caio".to_string()];

for nome in &nomes {


println!("{}", nome);
}

println!("{:?}", nomes);
}

 

Correlação com Python


Em Python, isso seria invisível para você.
Em Rust, no streaming, você sempre decide entre:
mover o dado
emprestar o dado
mutar o dado

Essa disciplina torna processamento contínuo muito seguro.

7. iter() , into_iter() e iter_mut()


Isso é obrigatório para entender streaming em Rust.

iter()
Percorre por referência imutável.

[Link] 7/25
11/03/2026, 12:49 Python vs Rust Streaming

Rust

let v = vec![1, 2, 3];


for x in [Link]() {
println!("{}", x);
}

iter_mut()
Percorre por referência mutável.

Rust

let mut v = vec![1, 2, 3];


for x in v.iter_mut() {
*x *= 2;
}
println!("{:?}", v);

into_iter()
Consome a coleção.

Rust

let v = vec![1, 2, 3];


for x in v.into_iter() {
println!("{}", x);
}
// v não pode mais ser usado

Analogia com Python


Python não separa isso formalmente.

Em Rust, você precisa pensar:

quero só ler? → iter()


quero alterar? → iter_mut()
quero transferir propriedade? → into_iter()

Para streaming, isso é fundamental.

8. Streaming de bytes: Read


Quando o dado não vem “linha por linha”, mas como bytes, Rust usa traits de I/O.
[Link] 8/25
11/03/2026, 12:49 Python vs Rust Streaming

Exemplo: ler em blocos

Rust

use std::fs::File;
use std::io::{self, Read};

fn main() -> io::Result<()> {


let mut file = File::open("[Link]")?;
let mut buffer = [0u8; 1024];

loop {
let n = [Link](&mut buffer)?;
if n == 0 {
break;
}

println!("Li {} bytes", n);


// processa &buffer[..n]
}

Ok(())
}

Correlação com Python

Python

Python Executar

with open("[Link]", "rb") as f:


while True:
chunk = [Link](1024)
if not chunk:
break
print(f"Li {len(chunk)} bytes")

Ponte mental
[Link](1024) ↔ [Link](&mut buffer)
chunk ↔ &buffer[..n]

A diferença é que em Rust você controla o buffer explicitamente.


Isso dá mais performance e menos alocação desnecessária.

9. Por que Rust é muito forte em streaming


[Link] 9/25
11/03/2026, 12:49 Python vs Rust Streaming

Rust brilha em streaming porque junta:


alta performance
controle de memória
zero-cost abstractions
segurança contra data races
concorrência segura
processamento incremental sem garbage collector

Em Python
Você consegue fazer streaming muito bem, mas em cenários pesados pode sofrer com:

GIL
overhead de objetos
mais alocações
menor previsibilidade de latência

Em Rust
Você ganha:
uso de memória mais previsível
mais throughput
ótimo comportamento para sistemas embarcados, rede, telemetria, logs, parsers e
backpressure

10. Streaming assíncrono em Rust


Agora entramos no ponto mais moderno.

Quando os dados chegam da rede, socket, fila ou API, o modelo costuma ser assíncrono.

Em Python
Você talvez já tenha visto:

Python Executar

import asyncio

async def main():


await [Link](1)
print("ok")

[Link] 10/25
11/03/2026, 12:49 Python vs Rust Streaming

[Link](main())

Ou streams com async for .

Em Rust
Você normalmente usa Tokio.

[Link]

TOML

[dependencies]
tokio = { version = "1", features = ["full"] }
tokio-stream = "0.1"
futures = "0.3"

Exemplo simples com canal assíncrono

Rust

use tokio::sync::mpsc;
use tokio_stream::{wrappers::ReceiverStream, StreamExt};

#[tokio::main]
async fn main() {
let (tx, rx) = mpsc::channel(10);

tokio::spawn(async move {
for i in 0..5 {
[Link](i).[Link]();
}
});

let mut stream = ReceiverStream::new(rx);

while let Some(item) = [Link]().await {


println!("Recebido: {}", item);
}
}

11. Comparando com Python async


[Link] 11/25
11/03/2026, 12:49 Python vs Rust Streaming

Python

Python Executar

import asyncio

async def producer(queue):


for i in range(5):
await [Link](i)

async def consumer(queue):


while True:
item = await [Link]()
print("Recebido:", item)
queue.task_done()

async def main():


queue = [Link]()
asyncio.create_task(producer(queue))
asyncio.create_task(consumer(queue))
await [Link](1)

[Link](main())

Rust equivalente mental


[Link]() ↔ tokio::sync::mpsc::channel(...)

await [Link](i) ↔ [Link](i).await

item = await [Link]() ↔ [Link]().await

12. A diferença entre Iterator e Stream


Esse ponto costuma confundir quem vem de Python.

Iterator
É síncrono.

Você chama:

next()

E recebe:
Some(item) ou None

[Link] 12/25
11/03/2026, 12:49 Python vs Rust Streaming

Stream
É assíncrono.

Você chama:

next().await

E recebe:

Some(item) ou None

Resumo mental

Python
for x in algo: → síncrono

async for x in algo: → assíncrono

Rust
Iterator → síncrono

Stream → assíncrono

Excelente correlação.

13. Exemplo real de pipeline de streaming


Vamos imaginar um fluxo de logs chegando e sendo filtrados.

Rust assíncrono

Rust

use tokio::sync::mpsc;
use tokio_stream::{wrappers::ReceiverStream, StreamExt};

#[tokio::main]
async fn main() {
let (tx, rx) = mpsc::channel(100);

tokio::spawn(async move {
let logs = vec![
"INFO: sistema iniciado",
"ERROR: falha no banco",
"INFO: tentativa de reconexao",
"ERROR: timeout",
[Link] 13/25
11/03/2026, 12:49 Python vs Rust Streaming

];

for log in logs {


[Link](log.to_string()).[Link]();
}
});

let stream = ReceiverStream::new(rx);

let errors: Vec<String> = stream


.filter(|msg| [Link]("ERROR"))
.collect()
.await;

for err in errors {


println!("{}", err);
}
}

O que isso lembra em Python?

Python Executar

logs = [
"INFO: sistema iniciado",
"ERROR: falha no banco",
"INFO: tentativa de reconexao",
"ERROR: timeout",
]

errors = [msg for msg in logs if "ERROR" in msg]


for err in errors:
print(err)

Diferença prática
Em Rust, esse fluxo pode estar vindo da rede em tempo real, com backpressure e
concorrência segura.

14. Backpressure: conceito importantíssimo


Se você quer trabalhar com streaming de verdade, precisa entender isso.

O que é backpressure?
É quando o produtor gera dados mais rápido do que o consumidor consegue processar.

[Link] 14/25
11/03/2026, 12:49 Python vs Rust Streaming

Em Python
Às vezes isso explode memória ou lota fila se você não controlar bem.

Em Rust com canais limitados

Rust

let (tx, rx) = mpsc::channel(10);

Esse 10 é a capacidade do buffer.

Se lotar:

o send().await espera
isso desacelera o produtor
o sistema fica mais estável

Isso é excelente para:


telemetria
filas internas
leitura de sensores
pipelines ETL
sistemas de rede
processamento de eventos

15. Trait: a peça conceitual que em Python seria


“protocolo”
Em Rust, muita coisa do streaming gira em torno de traits.

Exemplos
Iterator
Read

BufRead

Write

Stream

Analogia com Python


Lembra um pouco:

[Link] 15/25
11/03/2026, 12:49 Python vs Rust Streaming

duck typing
protocolos
objetos que implementam certos métodos

Mas em Rust isso é:


explícito
verificado em compilação
otimizado

Exemplo:

Rust

fn processar_linhas<R: BufRead>(reader: R) {
for line in [Link]() {
println!("{:?}", line);
}
}

Leitura mental
“Essa função aceita qualquer coisa que implemente BufRead .”

Em Python, seria parecido com:


“qualquer objeto que se comporte como arquivo”.

16. Exemplo didático: construir seu próprio iterator


Isso ajuda muito a entender streaming em Rust.

Rust

struct Contador {
atual: u32,
max: u32,
}

impl Iterator for Contador {


type Item = u32;

fn next(&mut self) -> Option<Self::Item> {


if [Link] < [Link] {
let valor = [Link];
[Link] += 1;
Some(valor)
} else {
[Link] 16/25
11/03/2026, 12:49 Python vs Rust Streaming

None
}
}
}

fn main() {
let contador = Contador { atual: 0, max: 5 };

for n in contador {
println!("{}", n);
}
}

Correlação com Python generator

Python Executar

def contador(maximo):
atual = 0
while atual < maximo:
yield atual
atual += 1

Diferença conceitual
Em Python, yield esconde a máquina de estados.
Em Rust, você pode modelar isso explicitamente via Iterator .

17. Quando usar cada abordagem em Rust


Iterator
Use quando:
os dados já estão locais
processamento é síncrono
leitura é simples e bloqueante
pipeline é CPU-bound pequeno ou médio

Exemplos:
arquivos
vetores
parsing local
transformação em lote

[Link] 17/25
11/03/2026, 12:49 Python vs Rust Streaming

Read / BufRead
Use quando:
está lendo bytes ou linhas
quer eficiência de I/O
quer processar sem carregar tudo na memória

Exemplos:
arquivos grandes
stdin
pipes
logs

Stream + Tokio
Use quando:
os dados chegam ao longo do tempo
há concorrência
rede, sockets, canais, filas
quer arquitetura reativa

Exemplos:

websocket
TCP
filas de eventos
telemetria
microserviços
IoT

18. Exemplo mental para IoT e sistemas embarcados


Como você gosta de IoT, essa correlação vai te ajudar muito.

Imagine um ESP32 ou gateway recebendo dados de sensores.

Em Python
Você poderia ter algo assim:

[Link] 18/25
11/03/2026, 12:49 Python vs Rust Streaming

Python Executar

def ler_sensor():
while True:
valor = obter_amostra()
yield valor

Em Rust
Você pode modelar como:
iterator, se for síncrono
stream/canal, se houver tarefas concorrentes
leitura em buffer, se vier por serial/UART/TCP

Conceitualmente
sensor produz dado
canal transmite
consumidor processa
buffer limita pressão
ownership garante segurança

Esse modelo é excelente para sistemas embarcados e edge computing.

19. Erros em streaming: Python vs Rust


Python
Você muitas vezes trata erro em runtime:

Python Executar

try:
with open("[Link]") as f:
...
except Exception as e:
print(e)

Rust
Erros aparecem de forma explícita:

Rust

[Link] 19/25
11/03/2026, 12:49 Python vs Rust Streaming

use std::fs::File;
use std::io::{self, BufRead, BufReader};

fn main() -> io::Result<()> {


let file = File::open("[Link]")?;
let reader = BufReader::new(file);

for line in [Link]() {


let line = line?;
println!("{}", line);
}

Ok(())
}

Vantagem
No streaming, isso reduz muito bug silencioso.

20. Modelo mental definitivo para você


Guarde isso:

Python
Streaming =
iterables + generators + async for + queues

Rust
Streaming =
Iterator + Read/BufRead + Stream + channels + ownership

21. Tabela de correlação rápida


Conceito Python Rust

Iteração simples for x in xs for x in xs

Geração lazy yield , generator expression Iterator

Ler arquivo em fluxo for linha in f BufReader::lines()

Ler bytes por bloco [Link](1024) read(&mut buffer)

[Link] 20/25
11/03/2026, 12:49 Python vs Rust Streaming

Conceito Python Rust

Fila assíncrona [Link] tokio::sync::mpsc

Loop assíncrono async for StreamExt::next().await

Tipagem de capacidade duck typing/protocols traits

Memória dinâmica/GC ownership/borrowing

22. O que mais confunde quem vem do Python


1. String vs &str
Em streaming textual isso aparece toda hora.
String = dono do texto

&str = referência para texto

Python não separa isso.

2. Consumo de valores
Você itera e perde a coleção se usar into_iter() .

Python quase nunca força esse raciocínio.

3. Option e Result
Rust deixa explícito quando:
pode não haver próximo item
pode haver erro

Isso deixa o streaming muito mais robusto.

4. Async em Rust é mais explícito


Você precisa runtime, crates, traits auxiliares.

Em troca, ganha muito controle e performance.


[Link] 21/25
11/03/2026, 12:49 Python vs Rust Streaming

23. Estratégia prática para aprender rápido vindo de


Python
Minha recomendação direta:

Etapa 1
Aprenda muito bem:

Vec
String e &str

iter() , iter_mut() , into_iter()

map , filter , collect

Etapa 2
Aprenda I/O:

File
Read

BufRead
BufReader

Etapa 3
Aprenda concorrência:
threads
mpsc

ownership entre tarefas

Etapa 4
Aprenda async:
tokio

async fn

await

StreamExt

Essa sequência é a melhor para não embolar.

[Link] 22/25
11/03/2026, 12:49 Python vs Rust Streaming

24. Exemplo completo e didático: arquivo grande filtrando


linhas
Rust

Rust

use std::fs::File;
use std::io::{self, BufRead, BufReader};

fn main() -> io::Result<()> {


let file = File::open("[Link]")?;
let reader = BufReader::new(file);

let erros: Vec<String> = reader


.lines()
.filter_map(|line| match line {
Ok(texto) if [Link]("ERROR") => Some(texto),
_ => None,
})
.collect();

for erro in erros {


println!("{}", erro);
}

Ok(())
}

Explicando passo a passo

[Link]()

Transforma o leitor em stream síncrono de linhas.

filter_map(...)

Filtra e transforma ao mesmo tempo.

Ok(texto) if [Link]("ERROR")

Só passa linhas válidas que contêm "ERROR" .

collect()

Materializa o resultado em Vec<String> .

[Link] 23/25
11/03/2026, 12:49 Python vs Rust Streaming

Python equivalente

Python Executar

with open("[Link]", "r", encoding="utf-8") as f:


erros = [[Link]() for linha in f if "ERROR" in linha]

for erro in erros:


print(erro)

25. Onde Rust supera brutalmente Python em streaming


Rust tende a ser muito forte em:
parser de arquivos grandes
processamento contínuo de logs
gateways IoT
proxies e serviços TCP/UDP
telemetria em tempo real
pipelines de alta taxa
software embarcado
sistemas com restrição de memória
processamento paralelo previsível

Python continua ótimo para:


prototipação
ETL simples
scripts rápidos
integração
análise exploratória

A decisão prática costuma ser:


Python para provar a ideia rápido
Rust para colocar o pipeline crítico para rodar com eficiência

26. Resumo final em linguagem simples


Pense assim:
Python faz streaming de maneira mais leve e produtiva.
Rust faz streaming com mais rigor, mais segurança e mais performance.
[Link] 24/25
11/03/2026, 12:49 Python vs Rust Streaming

A ponte mental principal é:


generator em Python ↔ Iterator em Rust
async for em Python ↔ Stream em Rust

[Link] ↔ tokio::mpsc

arquivo iterável ↔ BufReader::lines()


[Link](chunk) ↔ Read::read(&mut buffer)

E o grande diferencial do Rust é:


ownership
borrowing
controle explícito
segurança em compilação

27. Próximo passo ideal


Para aprender isso de verdade, o melhor exercício é construir nesta ordem:
1. leitor de arquivo linha por linha
2. filtro de logs com Iterator
3. leitura de bytes em chunks
4. producer/consumer com mpsc
5. stream assíncrono com Tokio

Eu posso te entregar agora uma trilha prática com 5 exemplos progressivos em Rust,
comparando com Python, começando do básico até um mini pipeline de streaming em
tempo real.

[Link] 25/25

Você também pode gostar