Simple Science

Ciência de ponta explicada de forma simples

# Informática# Bases de dados# Linguagens de programação

Melhorando a Velocidade da Análise de Dados com Reescrita de Código

Uma ferramenta que reescreve código pra melhorar o desempenho da análise de dados sem esforço.

― 8 min ler


Acelere sua Análise deAcelere sua Análise deDadosmudar código.processamento de dados sem precisarUma ferramenta pra acelerar o
Índice

Nos últimos anos, bibliotecas de manipulação de dados, como o PANDAS, ganharam muitos usuários. Elas são legais para várias tarefas, especialmente quando se trata de explorar dados em busca de insights. Mas, muitos dos atuais Ferramentas que visam acelerar o processamento de dados focam em operações em larga escala, que são diferentes das tarefas menores que a maioria dos usuários faz. Esses ferramentas geralmente vêm com um monte de trabalho extra que pode deixar as coisas mais lentas ao invés de rápidas.

Para resolver esse problema, a gente propõe usar reescrita de programas como uma forma mais simples e eficaz de melhorar o Desempenho. Esse método permite que os usuários reescrevam o Código de um jeito que acelera o processamento sem interromper o fluxo de trabalho deles. Criamos uma ferramenta que reescreve automaticamente o código em cadernos de Análise de Dados para ele rodar mais rápido. Essa ferramenta verifica o código e reescreve partes específicas para melhorar a velocidade, mantendo a lógica original intacta.

Contexto

Pandas e bibliotecas similares se tornaram essenciais para muitos usuários, incluindo pesquisadores e analistas de negócios. Elas oferecem flexibilidade e permitem fácil integração com outras ferramentas, fazendo delas populares para analisar e visualizar dados. No entanto, à medida que mais usuários aproveitam essas bibliotecas, a demanda por melhorias na velocidade e desempenho também cresceu.

Atualmente, muitas bibliotecas focam em rodar tarefas em várias máquinas para lidar com grandes conjuntos de dados. Esse método funciona bem para big data, mas pode ser ineficiente para tarefas menores e mais interativas que são comuns na exploração de dados. Por exemplo, muitos usuários querem fazer análises rápidas em suas máquinas locais, mas as bibliotecas projetadas para computação distribuída costumam deixar essas tarefas rotineiras mais lentas.

O Desafio das Operações Individuais

Muitos usuários dependem do pandas para tarefas que envolvem acessar elementos individuais ou aplicar funções personalizadas aos seus dados. Por exemplo, quando um usuário precisa comparar linhas ou processar dados passo a passo, os métodos tradicionais podem ficar lentos. Isso é particularmente evidente ao comparar valores de diferentes linhas em um loop, que pode ser centenas de vezes mais lento ao usar algumas bibliotecas paralelas.

Além disso, bibliotecas como modin e dask, que visam aumentar o desempenho, nem sempre são eficazes para essas operações individuais. Na verdade, elas muitas vezes introduzem sobrecarga de memória que pode complicar o processo. Essa situação pode ser frustrante para usuários que simplesmente querem realizar tarefas simples sem se complicar com configurações difíceis ou performance lenta.

Uma Nova Abordagem: Reescrita de Programas

Para enfrentar esses desafios, a gente propõe usar a reescrita de programas. Essa técnica envolve substituir automaticamente seções de código por alternativas mais rápidas que entregam os mesmos resultados. Assim, os usuários se beneficiam de uma velocidade melhor sem precisar se aprofundar nos detalhes técnicos da otimização.

A abordagem funciona analisando o código usado em cadernos de análise de dados e identificando partes que podem ser reescritas para rodar mais rápido. Por exemplo, um usuário pode ter um loop que processa dados linha por linha, que poderia ser transformado em uma função mais eficiente que opera em todo o conjunto de dados de uma vez.

Como Funciona

A ferramenta que desenvolvemos opera analisando o código em tempo real enquanto ele roda em um ambiente de caderno. Quando um usuário executa uma célula de código, a ferramenta verifica se há oportunidades de reescrita. Se encontrar uma candidata adequada, muda o código antes de executá-lo. Esse método pode levar a melhorias significativas de velocidade sem que os usuários precisem modificar manualmente seu código original.

Para garantir que esse processo de reescrita não altere os resultados desejados, construímos um sistema que verifica a correção. Ele faz checagens que determinam se o código reescrito produzirá a mesma saída que o original. Isso é feito dinamicamente, ou seja, as checagens acontecem em tempo real, permitindo uma experiência interativa.

Melhorias de Desempenho

Nas nossas avaliações, vimos resultados impressionantes dessa abordagem de reescrita. Por exemplo, conseguimos aumentos de velocidade de até 57 vezes para células de código individuais e 3,6 vezes para cadernos inteiros comparados a rodar o código original do pandas. Essas melhorias vêm sem sobrecarga significativa em termos de memória ou complicações nos fluxos de trabalho existentes dos usuários.

Uma das características mais legais dessa ferramenta é que ela permanece transparente para os usuários. Eles ainda podem ver seu código original e notar as vantagens das versões otimizadas sem precisar aprender uma nova sintaxe ou biblioteca. Esse design amigável é crucial, já que permite que não especialistas aproveitem as melhorias de velocidade sem a curva de aprendizado acentuada que costuma vir com sistemas mais complexos.

Casos de Uso e Exemplos

Para ilustrar como essa reescrita de programas funciona, vamos ver algumas tarefas comuns que os usuários geralmente realizam no pandas.

Tarefa Comum 1: Comparações de Linhas

Suponha que um usuário queira comparar os valores na coluna "VendorID" para linhas sucessivas e atribuir um identificador único sempre que o valor permanecer o mesmo. Ele poderia escrever algo assim:

for i in range(1, len(df)):
    if df.loc[i, 'VendorID'] == df.loc[i - 1, 'VendorID']:
        df.loc[i, 'discourse_nr'] = counter

Esse código faz um loop pelas linhas, processando uma de cada vez. O sistema de reescrita pode otimizar isso eliminando o loop e reescrevendo como uma operação vetorizada que processa toda a coluna de uma vez, resultando em um aumento substancial de velocidade.

Tarefa Comum 2: Aplicando Funções Personalizadas

Outra tarefa frequente é aplicar funções personalizadas às linhas de dados. Um usuário pode definir uma função para calcular uma classificação ponderada:

def weighted_rating(x, m=m, C=C):
    v = x['vote_count']
    R = x['vote_average']
    return (v / (v + m) * R) + (m / (m + v) * C

df.apply(weighted_rating, axis=1)

Embora isso funcione, a ferramenta pode reescrevê-lo para operar diretamente no DataFrame inteiro em vez de usar apply(), que pode ser muito mais lento. A versão reescrita calcula os resultados diretamente de forma mais eficiente, acelerando o processo como um todo.

Avaliação de Desempenho

Testamos o sistema de reescrita em cadernos do mundo real coletados de várias fontes, especialmente do Kaggle. Nossas avaliações mostraram que em muitos casos, a ferramenta identificou oportunidades para reescrita e melhorou a velocidade de execução.

No total, examinamos cerca de vinte cadernos diferentes e descobrimos que metade deles se beneficiou do processo de reescrita. Os aumentos de velocidade variaram bastante, com alguns cadernos apresentando melhorias de mais de 3,5 vezes mais rápidos do que sua execução original.

Além disso, enquanto alguns cadernos enfrentaram lentidões ou não aceleraram com a ferramenta, o impacto geral no desempenho foi amplamente positivo. Notavelmente, as lentidões observadas estavam dentro dos limites aceitáveis, muitas vezes abaixo de 3% em comparação com os tempos de execução originais.

Uso de Memória e Recursos

Uma das grandes vantagens do nosso sistema é que ele não adiciona nenhuma sobrecarga de memória adicional. Os usuários normalmente rodam seus cadernos diretamente na memória, e nossa ferramenta de reescrita respeita isso. Isso significa que os usuários podem executar suas análises sem se preocupar em ultrapassar os limites de memória.

Em contraste, outras bibliotecas projetadas para processamento paralelo frequentemente consomem quantidades significativamente maiores de memória, levando a problemas de desempenho. Nossa ferramenta evita essas armadilhas, tornando-a uma opção adequada para usuários individuais que trabalham com laptops pessoais ou máquinas com recursos limitados.

Conclusão

Em resumo, nossa ferramenta de reescrita de programas oferece uma solução inovadora para melhorar a eficiência da análise de dados em cadernos. Ao identificar e reescrever automaticamente segmentos de código para aprimorar o desempenho, os usuários podem desfrutar de tempos de execução muito mais rápidos sem alterar significativamente seus fluxos de trabalho existentes.

Essa abordagem não só aumenta a velocidade, mas também mantém a lógica e a estrutura do código original do usuário. O sistema se mostrou eficaz em uma variedade de tarefas do mundo real e foi projetado para ajudar tanto usuários inexperientes quanto experientes a aproveitar as melhorias de velocidade sem esforço. À medida que a análise de dados continua a crescer em importância em várias áreas, ferramentas como essa podem ajudar a tornar o trabalho com dados mais rápido e eficiente para todos.

Fonte original

Título: Dias: Dynamic Rewriting of Pandas Code

Resumo: In recent years, dataframe libraries, such as pandas have exploded in popularity. Due to their flexibility, they are increasingly used in ad-hoc exploratory data analysis (EDA) workloads. These workloads are diverse, including custom functions which can span libraries or be written in pure Python. The majority of systems available to accelerate EDA workloads focus on bulk-parallel workloads, which contain vastly different computational patterns, typically within a single library. As a result, they can introduce excessive overheads for ad-hoc EDA workloads due to their expensive optimization techniques. Instead, we identify program rewriting as a lightweight technique which can offer substantial speedups while also avoiding slowdowns. We implemented our techniques in Dias, which rewrites notebook cells to be more efficient for ad-hoc EDA workloads. We develop techniques for efficient rewrites in Dias, including dynamic checking of preconditions under which rewrites are correct and just-in-time rewrites for notebook environments. We show that Dias can rewrite individual cells to be 57$\times$ faster compared to pandas and 1909$\times$ faster compared to optimized systems such as modin. Furthermore, Dias can accelerate whole notebooks by up to 3.6$\times$ compared to pandas and 26.4$\times$ compared to modin.

Autores: Stefanos Baziotis, Daniel Kang, Charith Mendis

Última atualização: 2024-06-10 00:00:00

Idioma: English

Fonte URL: https://arxiv.org/abs/2303.16146

Fonte PDF: https://arxiv.org/pdf/2303.16146

Licença: https://creativecommons.org/licenses/by/4.0/

Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.

Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.

Mais de autores

Artigos semelhantes