Polars 2.0 Afirma Ser 5× Mais Rápido... Então O Que Mudou?

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

스크립트

00:00:00O maior concorrente do Pandas está prestes a lançar a versão 2.0.
00:00:04A atualização do Polars está quase aí, e a maior mudança provavelmente não é a que você esperava.
00:00:09Por padrão, todas as consultas que você já escreveu passam a rodar em um motor diferente.
00:00:14Você não muda uma única linha.
00:00:15O Polars também deixa de garantir que as linhas voltem na ordem em que foram enviadas.
00:00:19Parece uma regressão, embora não seja, é o preço para viabilizar a primeira mudança.
00:00:24À medida que o Polars ganha mais força com a versão 2.0, ele está dando um baile no Pandas.
00:00:30Vamos dar uma olhada na maior atualização até agora.
00:00:37Bom, agora, desde o início dos tempos, o Pandas sempre foi a escolha padrão para a maioria dos trabalhos de dados.
00:00:43É simples, usado pelas massas, e não só funciona muito bem para análise de dados, mas também é fundamental no aprendizado de máquina.
00:00:49Então, um tempo atrás, surgiu o Polars.
00:00:51Ele sempre foi mais rápido que o Pandas.
00:00:53Já vamos falar sobre isso.
00:00:54Agora, com esta grande atualização 2.0, ele pode estar ficando cada vez mais perto de uma adoção maior.
00:01:00Já que você teve essa breve contextualização, o Polars discretamente mantinha dois motores há algum tempo.
00:01:05O que a maioria das pessoas usava era o motor em memória.
00:01:08Você pode pensar nele como um armazém.
00:01:10Ele carrega todo o seu conjunto de dados no chão do armazém e executa cada etapa da consulta por todo o espaço.
00:01:17E isso é extremamente rápido.
00:01:19Desde que tudo caiba na RAM.
00:01:21O motor de streaming funciona de forma diferente.
00:01:23Em vez de um único espaço gigante, ele é mais como uma linha de montagem.
00:01:27O Polars corta os dados em pequenos pedaços que os mantenedores chamam de Marcels.
00:01:32Esses pedaços são dimensionados para caber no cache da sua CPU.
00:01:36Aí eles são empurrados através do plano de consulta.
00:01:39Agora, diferentes partes da consulta podem continuar avançando em vez de esperar por todo o conjunto de dados.
00:01:43É daí que vem a velocidade.
00:01:44E, no fim das contas, é também o caminho para trabalhar com dados maiores que a sua memória.
00:01:49Mas há um porém.
00:01:50Se você tem oito operários em uma linha de montagem, eles não terminam necessariamente na mesma ordem em que começaram.
00:01:56E o mesmo vale para o Polars.
00:01:58Então, na 2.0, joins, group bys, unpivots... a documentação diz literalmente "etc."
00:02:04Não garantem mais a ordem das linhas.
00:02:06A menos que você peça isso explicitamente.
00:02:08Se você gosta de ferramentas de código para agilizar seu trabalho, não deixe de se inscrever.
00:02:11Temos vídeos novos o tempo todo.
00:02:13Certo, então é assim que isso se parece na prática.
00:02:15Eu vou rodar uv pip install --pre polars.
00:02:18E lembre-se dessa flag --pre.
00:02:20Nós vamos voltar a ela em um segundo.
00:02:22Beleza.
00:02:22Tenho aqui um LazyFrame com as chaves 2, 1, 0.
00:02:27Faço um left join com outro frame e depois dou um collect.
00:02:32E olhe só o resultado.
00:02:34Mesmo código do Polars 1.
00:02:35A ordem não é mais garantida.
00:02:37É o mesmo código, só que agindo diferente.
00:02:39Agora adiciono maintain_order="left" ao join.
00:02:43Posso executar novamente.
00:02:44Vou rodar aqui de novo.
00:02:45E a ordem original está de volta.
00:02:47Então, não é que o Polars esteja embaralhando nossos dados ao acaso.
00:02:51É o Polars dizendo: se a ordem importa, avise.
00:02:54Você realmente precisa especificar.
00:02:56E há outro detalhe bacana aqui.
00:02:58Rode a função explain em uma consulta.
00:03:01Ela não esconde o comportamento.
00:03:03Você só precisa saber onde procurar.
00:03:05Essa é a grande mudança de comportamento.
00:03:06Mas a 2.0 é curiosa porque não é exatamente um lançamento de recursos.
00:03:10É, na verdade, apenas uma faxina.
00:03:12E há uma boa quantidade de coisas sendo limpas aqui.
00:03:15Originalmente herdado do Pandas, tínhamos read_csv, que agora é só scan_csv com collect por baixo.
00:03:22O método profile de LazyFrame sumiu.
00:03:25Melt agora se torna unpivot.
00:03:28join_nulls vira nulls_equal.
00:03:30A conversão direta de inteiro para categorical foi removida.
00:03:35Você pode usar cat2 agora para ajudar com isso.
00:03:38A conversão direta de string para data foi removida.
00:03:41Usava-se string para date.
00:03:43Ao somar inteiros com sinal e sem sinal de 64 bits, o Polars agora entrega int128 em vez de converter em float e perder precisão em silêncio.
00:03:53E tem ainda mais chegando.
00:03:55Você pode usar o concat.
00:03:57Que agora recusa alturas incompatíveis em vez de tentar adivinhar o que você queria dizer.
00:04:02Essa é uma escolha bem inteligente por parte do Polars.
00:04:05Cada item removido gera um erro do tipo AttributeRemovedError.
00:04:09Ele próprio avisa qual método substituiu o antigo.
00:04:12Chame o melt, e o erro diz literalmente para usar unpivot com index e on.
00:04:17Todos esses erros se tornam praticamente um guia de como realmente usá-lo.
00:04:20Rode o código, quebre algo, corrija exatamente esse ponto com base no erro e continue em frente.
00:04:26E isso nos leva ao motivo pelo qual o Polars virou a ferramenta diária de tanta gente.
00:04:31O Pandas joga muitos problemas para o tempo de execução.
00:04:35O Polars tenta pegá-los cedo por meio de tudo isso.
00:04:37Você pode chamar collect_schema e descobrir que os tipos estão errados antes do Polars ler uma única linha.
00:04:44Ele apenas se antecipa ao que está por vir.
00:04:47E está ficando cada vez mais eficiente.
00:04:48Afinal, onde o Polars se encaixa?
00:04:50Bom, o DuckDB é focado em SQL.
00:04:53O Polars é uma API de expressões feita para Python.
00:04:56Também existem o Dask e o Spark.
00:04:58Eles são distribuídos.
00:04:59O Polars é focado em uma única máquina.
00:05:01A biblioteca em si é de código aberto.
00:05:04A nuvem do Polars não é.
00:05:05E esse detalhe muda as coisas quando chegamos ao desempenho.
00:05:09Agora, esse anúncio diz que o novo motor de streaming é facilmente cinco vezes mais rápido.
00:05:13Eu mexi com o Polars ao longo dos anos e sim, ele é mais rápido que o Pandas, mas nunca tive ganhos absurdos como cinco vezes mais rápido.
00:05:21Experimente em conjuntos de dados maiores.
00:05:23Com certeza você verá uma diferença na velocidade.
00:05:25Vai variar a cada execução e com cada conjunto de dados, mas você vai sentir a diferença e vê-la no tempo de execução.
00:05:30E esta é provavelmente a distinção mais importante de todo o lançamento.
00:05:34A parte que permitiria ao motor transbordar para o disco, execução de fato fora da memória, ainda não chegou.
00:05:40Portanto, hoje, streaming significa processamento em blocos e em paralelo.
00:05:43Ainda não significa que seu conjunto de dados possa ser magicamente maior que a RAM.
00:05:46A estimativa de 5x é uma expectativa do próprio Polars.
00:05:50Não há uma tabela de testes comparativos em lugar nenhum da postagem.
00:05:53E honestamente, a maioria das pessoas parece achar isso tranquilo.
00:05:55Muitos usuários pareceram felizes com um lançamento útil, embora sem grandes alardes.
00:05:59Não há um pacote enorme de recursos.
00:06:01Você não precisa aprender nada novo.
00:06:02Aqueles erros, conforme você programa, vão te dizer exatamente o que substituir.
00:06:07Apenas correções, faxina e o versionamento semântico usado da forma como deveria ser.
00:06:12Mas duas reclamações continuam aparecendo com frequência.
00:06:14A primeira é a ordem das linhas.
00:06:15Se maintain_order vem como falso por padrão, você pode criar bugs bem desagradáveis no código.
00:06:19Porque nada quebra.
00:06:21Seus números ainda podem estar completamente corretos.
00:06:23Eles só estão vinculados a linhas em uma ordem diferente.
00:06:26Isso é muito mais difícil de notar do que uma exceção.
00:06:29A segunda reclamação foi a palavra streaming aqui.
00:06:32Alegaram que é confuso para um motor que ainda não é verdadeiramente fora da memória.
00:06:38E há também os bugs de candidato a lançamento.
00:06:41Desde que a versão RC saiu, surgiu um problema de alta prioridade onde
00:06:44o group_by_dynamic lança um erro de data/hora fora do intervalo no motor de streaming.
00:06:49Chame o método limit.
00:06:51Bom, o limit não está encerrando cedo após um join.
00:06:54E string para datetime pode retornar nulo onde antes costumava lançar erros.
00:06:58É por isso que eu disse para guardar o comando de instalação com --pre.
00:07:02Versão pré 2.0.
00:07:04Esta ainda é uma versão candidata a lançamento.
00:07:06E agora, ela se comporta como tal.
00:07:08O que é normal.
00:07:09Certo?
00:07:09Ainda não é a versão final.
00:07:11Mais uma coisa.
00:07:12A crate em Rust ainda está na versão 0.55.
00:07:15Então, se você usa o Polars pelo Rust, ainda não existe o Polars 2.0 para você.
00:07:19Mas vou presumir que a maioria de nós deve estar apenas usando Python aqui.
00:07:24E aí, vale a pena atualizar?
00:07:25Bom, para um projeto novo, sim, eu atualizaria.
00:07:27Certo?
00:07:27Estamos nos adaptando a novas tecnologias, novas atualizações.
00:07:30Se o seu fluxo já usa sink_parquet ou sink_csv, você na prática já esteve usando
00:07:34o streaming durante todo esse tempo de qualquer forma.
00:07:36Mas há alguns casos em que eu esperaria um pouco.
00:07:39Entende?
00:07:39Se o seu código depende da ordem das linhas, não atualize apenas torcendo pelo melhor.
00:07:43Faça uma busca nos group bys que não têm um ordenamento em seguida.
00:07:47Se estiver usando group_by_dynamic, eu esperaria tudo isso se estabilizar.
00:07:51E quero dizer, é legal ver para onde isso muito provavelmente está indo.
00:07:54Isso provavelmente vai ser a 2.0, mas ainda não é o lançamento oficial.
00:07:57Dá para ir se habituando, mas ainda não chegou lá.
00:08:00O ponto em que sempre penso é no quão incomum este lançamento parece.
00:08:03O Polars 2.0 vem sem nenhum recurso novo.
00:08:07E ainda assim muda o comportamento do seu código existente.
00:08:10O novo motor é mais rápido na minha máquina, só não cinco vezes mais rápido.
00:08:14Então a 2.0 não é empolgante por adicionar um monte de novidades.
00:08:18É empolgante porque o Polars está usando uma grande mudança de versão para realmente limpar a base
00:08:24por baixo de tudo o que nós já estamos usando.
00:08:26Eu sou o Josh da BetterStack.
00:08:28Se você gosta de dicas e truques de programação como este, inscreva-se no canal.
00:08:30A gente se vê em outro vídeo.

핵심 요약

O Polars 2.0 adota o motor de streaming por padrão para acelerar consultas e processar dados em blocos paralelos, sacrificando a ordenação automática das linhas em favor do desempenho e da limpeza do código.

하이라이트

  • O Polars 2.0 define o motor de streaming como padrão para todas as consultas sem necessidade de alterar linhas de código.

  • A nova versão remove a garantia de ordem das linhas em operações como joins e group bys para viabilizar o processamento paralelo.

  • A remoção de métodos legados gera erros do tipo AttributeRemovedError, indicando diretamente no terminal a substituição correta.

  • No processamento de inteiros de 64 bits com e sem sinal, a biblioteca passa a entregar int128 para evitar perdas de precisão ao converter em float.

  • A versão em Rust permanece na 0.55, mantendo o Polars 2.0 restrito ao ecossistema Python durante a fase de release candidate.

타임라인

A mudança do motor de execução e a ordem dos dados

  • O Polars 2.0 altera o motor de execução padrão para todas as consultas existentes.
  • A garantia de ordenação de linhas deixa de existir em operações complexas.
  • O motor de streaming divide os dados em blocos ajustados ao cache da CPU chamados Marcels.

O motor em memória anterior carregava todo o conjunto de dados no espaço principal da RAM, o que limitava a escala ao tamanho do hardware. O motor de streaming opera como uma linha de montagem, fatiando os dados em unidades dimensionadas para o cache da CPU para avançar partes da consulta em paralelo. Essa arquitetura paralela impede a preservação natural da ordem inicial das linhas sem um comando de ordenação explícito.

Manutenção da ordem na prática e diagnóstico via logs

  • A ordenação original exige o parâmetro maintain_order nas operações.
  • A função explain expõe a estrutura do plano de consulta diretamente no código.

A execução de um join em um LazyFrame demonstra a alteração do resultado original quando comparado à versão 1.0. A adição de maintain_order=”left” restaura a sequência exata das chaves fornecidas. A inspecção do plano de execução via método explain permite verificar o comportamento exato sem alterar a lógica principal.

Remoção de rotinas legadas e tratamento de erros explicativo

  • Métodos derivados do Pandas foram completamente descontinuados.
  • O Polars passa a emitir exceções do tipo AttributeRemovedError com instruções de substituição.
  • Operações aritméticas entre inteiros de 64 bits retornam int128 em vez de float.

A versão 2.0 funciona primariamente como uma consolidação da base de código, descartando rotinas herdadas. O método read_csv passa a executar scan_csv com collect, enquanto melt dá lugar ao unpivot. Ao tentar invocar métodos removidos, as exceções geradas informam os nomes exatos das funções e parâmetros substitutos, orientando a refatoração do código diretamente nas mensagens do sistema.

Diferenças em relação ao ecossistema e escopo do motor de streaming

  • O Polars foca em execução mono-máquina via API de expressões Python.
  • O motor de streaming atual realiza processamento em blocos paralelos sem transbordo automático para o disco.
  • Erros de validação de tipo podem ser detectados com collect_schema antes do carregamento dos dados.

Diferente de sistemas distribuídos como Spark ou orientados a SQL como DuckDB, a biblioteca concentra suas otimizações no processamento local. A funcionalidade de streaming nesta fase refere-se ao fatiamento e paralelização em memória, não significando a capacidade de processar arquivos maiores que a RAM total do sistema via disco. A verificação antecipada de esquemas impede falhas ocorridas no meio do processamento de grandes arquivos.

Bugs conhecidos da versão prévia e diretrizes para atualização

  • A alteração no padrão de ordenação pode introduzir falhas silenciosas na lógica de negócios.
  • A versão de lançamento candidate apresenta falhas conhecidas em operações temporais e limites de consulta.
  • A crate em Rust permanece na versão 0.55 sem as alterações do Python.

A ausência de maintain_order padrão pode manter a exatidão dos dados numéricos, mas alterar a associação de linhas, dificultando a detecção de erros em comparação com exceções diretas. O candidato a lançamento apresenta problemas no método group_by_dynamic ao lidar com limites de data e encerramento antecipado com limit. A migração imediata é recomendada para novos projetos ou fluxos que já utilizavam saídas em disco via sink_parquet, mantendo a versão anterior em bases de código dependentes de agrupamentos dinâmicos ou ordem implícita.

커뮤니티 글

아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!

이 영상에 대해 글쓰기