Accelerare le manipolazioni di stringhe in Pandas
Accelerare manipolazioni stringhe in Pandas
Questo tutorial si concentra sull’accelerazione delle manipolazioni di stringhe.
Mi sono annoiato e ho deciso di testare i metodi di manipolazione delle stringhe e come influenzano le prestazioni di un dataframe di pandas. Come è ben noto, i dataframe di Pandas si comportano in modo strano una volta che superano un certo limite. Dipende principalmente dalla pressione della memoria e anche da alcuni sovraccarichi quando gli elementi di diverse righe devono essere manipolati contemporaneamente.
Quindi, ecco l’esperimento.
Ho creato un dataframe utilizzando Faker. I dati di base sono dati falsi di 100.000 righe.
Setup
!pip install faker
import pandas as pdimport numpy as npdef gen_data(x): from faker import Faker fake = Faker() outdata = {} for i in range(0,x): outdata[i] = fake.profile() return pd.DataFrame(outdata).Tn= 100000basedata = gen_data(n)
Ho salvato l’output su Google Drive mappandolo su Google Colab
- I più grandi inserzionisti del mondo abbracciano il potere dell’AI un cambio di paradigma nella pubblicità
- Pluggable Diffractive Neural Networks (P-DNN) Un paradigma generale che ricorre alle metasuperfici in cascata che può essere applicato per riconoscere varie attività mediante la commutazione di plugin interni
- Questa ricerca sull’IA propone TeCH per ricostruire una figura umana vestita in 3D realistica da un’unica immagine con geometria completa dettagliata del corpo e texture di alta qualità.
from google.colab import drivedrive.mount('/content/drive')
Ho creato delle funzioni molto semplici per testare vari modi di concatenare 2 stringhe.
def process(a,b): return ''.join([a,b])def process(a,b): return a+bdef process(a,b): return f"{a}{b}"def process(a,b): return f"{a}{b}"*100
Poi ho deciso di creare un dataframe vuoto e ho scritto una funzione per aggiungere un output di %%timeit
come riga al dataframe
# aggiungi una riga al dataframe utilizzando l'output di %%timeitdef add_to_df(n, m, x, outputdf): outputdf.loc[len(outputdf.index)] = [m, n, x]# dataframe di outputoutputdf = pd.DataFrame(columns=['method', 'n', 'timing'])outputdf
Ecco un esempio del codice per eseguire ogni funzione ed esportare i dati in un dataframe di pandas.
# ottieni un campione dei datan = 10000suffix = 'fstring_100x'data = basedata.copy().sample(n).reset_index()
%%timeit -r 7 -n 1 -odata['newcol'] = ''for row in range(len(data)): data.at[row ,'newcol'] = process(data.at[row, 'job'], data.at[row, 'company'])# 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)# <TimeitResult : 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>
m = "Iterating over the rows"add_to_df(n = n, m = m, x = vars(_), outputdf = outputdf)