Paralelizace a zrychlení v Pythonu

začátečník

Paralelizace a zrychlení v Pythonu
« kdy: 04. 03. 2015, 21:32:17 »
Ahoj,
chtěl bych Vás poprosit o nasměrování. Mám skript v pythonu, který dělá analýzu dat. Data jsou uložena v txt souboru. Každý soubor má cca 40.000 řádků, souborů je cca 30.000. Analýza přes tento soubor dat trvá cca 1.5h. Dat mám velké množství a rád bych analýzu urychlil.

Skrip načítá soubor po souboru a čte řádek po řádku. Napadlo mě proces rozdělit na n  paralelních běhů, kde by každý proces zpracovával pouze danou část souborů-dat (v rámci jednoho skriptu). Myslíte, že to urychlí zpracování dat. Jak byste to řešili Vy? Díky za tipy a nasměrování k paralelnímu zpracování.

Díky
« Poslední změna: 05. 03. 2015, 09:27:54 od Petr Krčmář »


monitor

Re:analýza dat- python - zrychlení
« Odpověď #1 kdy: 04. 03. 2015, 21:49:20 »
Zistit,kde a preco je to pomale...

Treba "profiling"... Zistit, kde ti program travi najviac casu...
Zamysliet sa, ci nahodou netravi kopu casu blbostami..
Potom sa zamysliet nad zlozitostou algoritmov ( ci nemas kvadraticku, ci nebodaj expomencialnu zlozitost tam, kde by mohla byt nebodaj linearna. Cize napriklad, pouzivas vhodne datove struktury? Optimalizovane na tvoj typ pouzitia?)

A nakoniec, vzdy sa daju najpomalsie casti prepisat do C-ka, a moze ti to potom ist este rychlejsie...


Ale zasada pri optimalizacii: meraj!!!

charon

Re:analýza dat- python - zrychlení
« Odpověď #2 kdy: 04. 03. 2015, 22:13:31 »
Zdravím,

obecný postup analýzy je ->  pre-procesing dat -> procesing dat -> post-procesing. Tak jak chápu popsaný problém a možné úzké místo je konverze hodnot z txt souborů na reálné číslo, což aktuálně máte nastaveno takto -> 30.000 souborů x cca 40.000 řádků, což je cca 12xE+8 volání funkce "str_to_float" (možná je ta funkce nazvána v Pythonu jinak) na konverzi textového čísla na skutečné float číslo.  Pak čas 1.5h je 5400 sekund, což Vám dává performance cca 2.22E+5 zpracovaných řádků/sec. To mi na Python připadne slušné.
Pokud chcete zrychlovat tak:
1) zvažte jak paralelizovat celé workflow pre-procesing dat -> procesing dat -> post-procesing.
2) urychlete konverzi čísel z TXT formátu na reálné číslo.
3) zamyslete se, zda-li část Python skriptu neumí lépe jiný nástroj, např. R-Plot.

Více lze poradit, až když uvedete typický řádek z jednoho souboru.

Tož tak.

začátečník

Re:analýza dat- python - zrychlení
« Odpověď #3 kdy: 04. 03. 2015, 22:14:04 »
díky, vyzkouším
první co mě napadlo byla hrubá síla -> rozdělit úlohu na n dalších

začátečník

Re:analýza dat- python - zrychlení
« Odpověď #4 kdy: 04. 03. 2015, 22:17:33 »
typický řádek:
109045.09;-0.0251;0.0465;0.0211;76


Roman Vasicek

Re:analýza dat- python - zrychlení
« Odpověď #5 kdy: 04. 03. 2015, 22:20:22 »
Můžes být trochu konkrétnější ohledně toho co děláš a nad jakými daty? Ukázat pár řádků (je to číslo, text či co?), nebo alespoň popsat strukturu a popřípadě i nějak zpřístupnit ten pomalý skript? Obecně se dá těžko poradit něco konkrétního, takže podívat se na použité datové struktury a algoritmus.

Roman Vasicek

Re:analýza dat- python - zrychlení
« Odpověď #6 kdy: 04. 03. 2015, 22:21:32 »
typický řádek:
109045.09;-0.0251;0.0465;0.0211;76
A co má být výstupem?

Re:analýza dat- python - zrychlení
« Odpověď #7 kdy: 04. 03. 2015, 22:28:40 »
Myslíte, že to urychlí zpracování dat. Jak byste to řešili Vy? Díky za tipy a nasměrování k paralelnímu zpracování.
Jak říkali kolegové, především si musíš změřit, kde vlastně trávíš nejvíc času. Pokud to chceš dělat na jednom stroji a nejvíc času trávíš čekáním na disk, tak ti logicky paralelizace nepomůže že jo :)

Takže jako první krok určitě změřit, kolik trvá načítání a kolik to vlastní zpracování (vůbec nepíšeš, jaký výpočet nad těmi daty probíhá).

Pokud bude zádrhel ve výpočtu, tak v první fázi rozhodně použít numpy, pandas a podobné balíky specializované na hromadné výpočty (pokud už je nepoužíváš), ve druhém kroku pak případně přepsání nějakých kritických částí do C.

Každopádně dej vědět, jak pokračuješ, zpracování dat je hodně zajímavá a žhavá parketa, určitě si o tom víc lidí rádo něco přečte.

začátečník

Re:analýza dat- python - zrychlení
« Odpověď #8 kdy: 04. 03. 2015, 22:46:51 »
provádím postprocessing nad daty ze simulace

struktura řádku:
sledovana_hodnota;X;Y;Z;id - float;float;float;float;int
109045.09;-0.0251;0.0465;0.0211;76

Výstupy z analýzy:
a) nalezení definovaných bodů X,Y,Z - uložení sledované hodnoty do matice; matice = [int;hodnota]
    - v každém souboru jsou nalezeny body dle definice a hodnoty uloženy do matice
b) četnost výskytu sledované hodnoty v definovaném intervalu rozsahu hodnot, 8 rozsahu hodnot, 5 časových intervalů, tj. názvu souborů

část skriptu:
# Definice sledovanych bodu
POINT_1 = ( 69, -0.0293, 0.0404, 0.0089)
POINT_2 = ( 69, -0.0288, 0.0400, 0.0092)
POINT_3 = ( 69, -0.0284, 0.0395, 0.0097)
POINT_4 = ( 69, -0.0286, 0.0401, 0.0084)

POINT_MATRIX = [  [POINT_1], [POINT_2] ], \
                            [  [POINT_3], [POINT_4] ]

# cast pro generaci nazvu souboru preskocena

  # ----- cteni souboru

      infile = open(filename,"r")
      print it,': ',filename

      for line in infile:     
   pressure = float(line.split(";")[0]) + const     
   x = float(line.split(";")[1])
   y = float(line.split(";")[2])
   z = float(line.split(";")[3])
   pidID = int(line.split(";")[4])
   
   for xx in range(xPM):      #pocet bodu v Y (je definovana matice sledovanych bodu - Y = 4)
     for yy in range(yPM):           #pocet bodu v X v Y (je definovana matice sledovanych bodu - X = 0)
       if (pidID == POINT_MATRIX[xx][yy][0][0]):
        if (x == POINT_MATRIX[xx][yy][0][1] and y == POINT_MATRIX[xx][yy][0][2] and z == POINT_MATRIX[xx][yy][0][3]):
          RES_POINT_MATRIX[xx,yy,it] = pressure
         
      infile.close()

.. způsob  zpracování dat jak čtu Vaše připomínky primitivní .. rád to však zkusím lépe

Re:analýza dat- python - zrychlení
« Odpověď #9 kdy: 04. 03. 2015, 22:51:21 »
Tak tohle rozhodně v žádném případě nedělej v čistém Pythonu. Podívej se na http://www.numpy.org/ http://pandas.pydata.org/ anebo rovnou http://www.scipy.org/

Ze začátku se asi budeš cítit jak Alenka v říši divů, ale to se poddá :) A s konkrétními dotazy určitě někdo rád pomůže.

Roman Vasicek

Re:analýza dat- python - zrychlení
« Odpověď #10 kdy: 04. 03. 2015, 22:59:51 »
      for line in infile:     
   pressure = float(line.split(";")[0]) + const     
   x = float(line.split(";")[1])
   y = float(line.split(";")[2])
   z = float(line.split(";")[3])
   pidID = int(line.split(";")[4])
   ...
co například začít už tím, že jeden a týž řádek nebudeš porcovat pětkrát?

Re:analýza dat- python - zrychlení
« Odpověď #11 kdy: 04. 03. 2015, 23:01:33 »
co například začít už tím, že jeden a týž řádek nebudeš porcovat pětkrát?
Třeba spolíhal na to, že má Python líný vyhodnocování :)

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re:analýza dat- python - zrychlení
« Odpověď #12 kdy: 04. 03. 2015, 23:58:52 »
Koukni sem:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html

načti tím soubor najednou a pak s ním nějak rozumně - tj. pokud možno ne tak, aby pro každý řádek matice běželi dva cykly (přinejmenším si např. udělej slovník pro pid - x,y,z, ať Ti stačí zkontrolovat jen
jednu věc a ne xPM * yPM).

ecsd

Re:analýza dat- python - zrychlení
« Odpověď #13 kdy: 05. 03. 2015, 00:04:34 »
Jak uz nekdo rikal, 1
1) profiling - python -m cProfile --sort cumtime tvujScript.py
2) ta paralelizace si o to jasne rika - zkus google "parallel python " :)
3) alternativni (ryhlejsi) interpretery pythonu - pypy, cython ... muze to udelat docela dost muziky za malo penez

Re:analýza dat- python - zrychlení
« Odpověď #14 kdy: 05. 03. 2015, 00:05:39 »

3) alternativni (ryhlejsi) interpretery pythonu - pypy, cython ... muze to udelat docela dost muziky za malo penez
Naprosto zbytecny. Ty zminovany matematicky baliky maji samozrejme potrebne casti udelane v C/C++.