Jak przyspieszyć Pythona jedną linijką kodu?

Chyba każda osoba pracująca z danymi chociaż raz w swoim życiu spotkała się z tym problemem: powolne ładowanie danych, które znacząco spowalnia proces analizy danych. Na niewiele zda się tu moc obliczeniowa, która nie rośnie aż tak szybko, jak wolumeny danych, z którymi pracujemy. Co zatem zrobić, jeśli nie chcemy wydawać górki pieniędzy na rozbudowę własnej infrastruktury, a usługi chmurowe nie wchodzą w grę? Okazuje się, że już wkrótce może się pojawić na to proste rozwiązanie.

Z tego wpisu dowiesz się:
- Czym jest Pandas on Ray?
- Czemu warto zainteresować się Pandas on Ray?
- Co zyskasz dzięki Pandas on Ray?

Wąskie gardło Pythona

Dzisiejszy wpis zainteresuje głównie osoby pracujące na co dzień Pythonie. Jedną z głównych bibliotek używanych w analizie danych i ML jest Pandas. W dużym skrócie dostarcza ona obiekty typu DataFrame służące do przechowywania danych, oraz niezbędne narzędzia do ich analizy. Niestety, ale w swojej podstawowej wersji Pandas jest relatywnie wolny. Przy operacji wczytywania danych, jak i obliczeniach pracuje tylko na jednym rdzeniu, co może być dosyć uciążliwe.

Mając na uwadze budowę dzisiejszych maszyn (nawet najtańsze laptopy posiadają procesor o wielu rdzeniach), jasnym staje się, że istnieje spory margines na poprawę wydajności. Ostatnio natknąłem się na ciekawą bibliotekę, która w najbliższym czasie może wypełnić wspomniany margines.

Pandas on Ray, bo o niej mowa, docelowo ma być alternatywą dla Pandasa. Biblioteka ta została napisana przez badaczy z Uniwersytetu Kalifornijskiego w Berkeley. Już dziś jest do kilkuset razy (!!!) szybsza od Pandasa. Cała tajemnica wysokiej wydajności tkwi w szeregu optymalizacji, które przeprowadzili autorzy. Największą zmianą w stosunku do Pandasa jest tu zrównoleglenie obliczeń pomiędzy wiele rdzeni procesora. Liczba rdzeni, które zostaną wykorzystane podczas pracy, jest parametrem opcjonalnym. Jeśli użytkownik nie zdecyduje inaczej, Pandas on Ray przeprowadza obliczenia na wszystkich dostępnych rdzeniach (zarówno CPU jak i GPU).

Jak to wygląda w praktyce?

Muszę przyznać, że kiedy pierwszy raz zobaczyłem obietnice autorów, to miałem spore wątpliwości co do tego, czy tak znaczące przyspieszenie jest w ogóle możliwe. Zainstalowałem więc bibliotekę i przeprowadziłem szereg testów. Wyniki były oszałamiające, ale idąc po kolei…

Instalacja Ray-a na systemie Linux (Ubuntu 16.04, Ubuntu Gnome 16.04, Manjaro) w podstawowym wariancie jest dziecinnie prosta. Wystarczy wywołać polecenie:

sudo pip install ray

Już po kilkudziesięciu sekundach biblioteka jest zainstalowana i gotowa do użycia.

Bezpośrednio po instalacji przeszedłem do testowania funkcjonalności i wydajności w praktyce. By zaimportować bibliotekę do projektu, wystary zastąpić linijkę, w której normalnie importujesz Pandas na:

import ray.dataframe as pd

Mocne strony PoR – testy wydajności

By przetestować szybkość działania obu bibliotek, wykonałem prosty eksperyment.

  1. Zaimportowałem obie biblioteki pod różnymi nazwami oraz numpy.
import ray.dataframe as pd_ray
import pandas as pd
import numpy as np
  1. Z pomocą numpy wygenerowałem tablicę o wymiarach 250 000 x 100, składającą się z losowych liczb. W oparciu o tablicę zbudowałem DataFrame, który zapisałem do pliku csv.
df = pd.DataFrame(np.random.rand(250000, 100))
df.info(memory_usage='deep') # 191 MB w pamięci
df.to_csv('plik.csv')
!du -h plik.csv # 462 MB na dysku
  1. Z użyciem modułu
    timeit

    zmierzyłem czas wczytywania pliku dla Pandas i Pandas on Ray.

timeit df_pd = pd.read_csv('plik.csv')
[output]: 6.05 s ± 85.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
timeit df_ray = pd_ray.read_csv('plik.csv')
[output]: 82.5 ms ± 21.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Jak widać, PoR jest ponad 73 razy szybszy niż tradycyjny Pandas 🙂 Wykonałem ten sam test na dwóch dodatkowych maszynach z systemem Linux o różnych konfiguracjach i otrzymywałem podobne wyniki. PoR był ok. 70 razy szybszy od Pandasa.

To, co udało mi się osiągnąć jest bez wątpienia znaomitym rezultatem, aczkolwiek nawet nie zblizyłem się do wyniku, który jest opublikowany na blogu uniwersytetu Berkeley. Tam PoR jest 675 razy szybszy niż tradycyjny Pandas. Przyczyną tak dużych różnic może być konfiguracja maszyn. Ja nie dysponowałem maszyną o 8 rdzeniach (w każdym przypadku miałem cztery rdzenie), tak jak autorzy biblioteki, a przecież zrównoleglenie obliczeń pomiędzy rdzeniami jest kluczowym elementem.

Słabe strony PoR

Czytając powyższe akapity pewnie zastanawiasz się czemu nie przeprowadziłem większej liczby tetsów. Odpowiedź jest prosta: nie mogłem. Powody były dwa:

  1. PoR był na tyle niestabilny, że wykonanie jakiejkolwiek skomplikowanej operacji kończyło się błędami i niekiedy restarter kernela. Stabilność testowałem na trzech różnych maszynach (dwóch fizycznych i jednej VM na Google Cloud). We wszystkich przypadkach natknąłem się na te same problemy, dlatego nie rekomenduję używania PoR produkcyjnie.
  2. Część operacji na DataFrame-ach nie została jeszcze zainmplementowana w PoR. Pandas on Ray ciągle jest w fazie rozwojowej, co widać po liczbie zgłoszonych błędów na GitHubie.

Próbowałem również różnych wersji biblioteki. Autorzy dają możliwość zainstalowania najnowszej wersji, która nie jest dostępna bezpośrednio z pip-a. Link do opisu instalacji znajduje się tutaj. Niewiele to pomogło.

Kolejnym minusem jest brak wsparcia pod systemem Windows. Jeśli korzystasz z systemu Microsoftu, to niestety nie zainstalujesz PoR. Na dzień pisania tego artykułu wspierane są: Linux i Mac OS.

Podsumowanie

Pandas on Ray jest bardzo ciekawą propozycją, choć wciąż mocno niedojrzałą. Wszyscy, którzy cierpią z powodu niskiej wydajności Pandasa jeszcze będą musieli jeszcze poczekać aż PoR „dojrzeje”. Na razie należy go traktować jako ciekawostkę o dużym potencjale na przyszłość.

Plusy:

  • szybkość.

Minusy:

  • stabilność,
  • funkcjonalność.

Źródła:

photo: towardsdatascience.com

Podobał Ci się ten artykuł?

Jeśli tak, to zarejestruj się, by otrzymywać informacje o nowych wpisach. Dodatkowo w prezencie wyślę Ci bezpłatny poradnik 🙂

Bądź pierwszy, który skomentuje ten wpis!

Dodaj komentarz

Twój adres email nie zostanie opublikowany.


*