#pandas #python #dane
Fun fakt jak detale potrafią zabrać mnóstwo czasu a zarazem popchnąć w over-engineering.
Stakeholderzy zaczeli zgłaszać, że call do naszego api, z konkretną listą parametrów, zwraca wyniki za późno. Max czas do zaakceptowania to 20 sec, gdyż po tym właśnie czasie ichniejszy system rzuca timeoutem. Zwrotka zajmowała natomiast 30 sekund.
Api to taki ogromny agregat wypluwający dane telemetryczne, bazujący w głównej mierze na pandasie. Po debugu okazało się, że winowajcą jest jedna linia, która tworzy pivota na dużym zbiorze danych.
I tutaj zaczęły się cyrki. Ludzie chcieli już ograniczać dane, bo: "TO WINA DANYCH" albo przepisywać ten moment przy użyciu multiprocesingu (Chunkowanie df na mniejsze i pivotowanie tego paraell a na końcu iteracyjne mergowanie wszystkiego w całość). No niby można, ale po co?
Z tyłu głowy miałem, że pandas (tak jak spark z resztą) z automatu narzuca typ float64
w przypadku wartości numerycznych. Precyzja w przypadku tych danych jest mała, więc float32
zrobił by robotę i podniósł ogólną wydajność. Szybki test i jak się okazało miałem racje. Czas spadł z 30 sekund do 8 :)
Mały detal a zaoszczędził reszcie x dni krwawicy i cudowania jak koń pod górkę :P Niekiedy diabeł po prostu tkwi w szczegółach.
Profiling prawdę powie. Czasem analizowanie jakiegoś większego zbioru w pandas, to udręka. Szybciej wrzucić DFa do DuckDB, czy sqlite'a i tam zrobić cięższe operacje, niż umierać wydajnościowo na konwersjach typów.
W przypadku obecnych danych nic na to nie wskazuje. Ale wiadomo, wszystko może się zmienić.
Przy projektowaniu sieci neuronowych często się używa nawet 16 bitowej precyzji, bo i tak jest wystarczająca, a tak na CPU więcej takich zmieścimy w pojedynczym cache line i SIMD, a na GPU wychodzi gdzieś 2x lepszy performance.
a jakbyście to napisali w poważnym języku np. na jvm to mielibyście 1 sekundę. Nie rozumiem jak tak powolny język (python) zdobył taką popularność.
@LitwinWileński: Ponieważ jest prosty w nauce i wystarczająco dobry dla większości zastosowań firmowych, nie wymagając przy tym zaawansowanej wydajności.
@LitwinWileński: prosto na to odpowiedzieć pytaniem retorycznym.Czemu w jakimś wolnym jvm, skoro można w języku asemblera?
@LitwinWileński: Zgadzam się z ledi, większość bottlenecków nie zależy od technologii tylko od designu jednak. Powiedziałbym że 99%.
@Pyxis: no tylko że pajton jest tak samo wysokopoziomowych językiem jak Java tylko trudniejszym i wolniejszym
@ledi12: to chyba Ty żartujesz. Napisanie czegoś dobrego w Pythonie jest bardzo trudne. Języki statycznie typowane bronią Cię przed własną głupotą piszącego, przed niespodziewanymi failami na produkcji itd. Jeśli coś dużego jest napisane w Pythonie, i się nie wypierdala, i handluje wszystkie egzotyczne przypadki - to jest to bardzo trudne. Tak trudne, że jeszcze tego nie widziałem xD
Duże rzeczy w pythonie raczej mają jakąś nakładkę z typowaniem jak js z ts xD
@ToTomki: powiem tak - i tak dobrze i tak dobrze xD obydwa sposoby są rewelacyjne dla mnie xD
Nice, widać żeś profesjonalista.