2017-08-07 1 views

Antwort

7

Der einfachste Weg ist Dask's map_partitions zu verwenden. Sie müssen diese Importe (Sie werden zu pip install dask benötigen):

import pandas as pd 
import dask.dataframe as dd 
from dask.multiprocessing import get 

und die Syntax ist

data = <your_pandas_dataframe> 
ddata = dd.from_pandas(data, npartitions=30) 

def myfunc(x,y,z, ...): return <whatever> 

res = ddata.map_partitions(lambda df: df.apply((lambda row: myfunc(*row)), axis=1)).compute(get=get) 

(Ich glaube, dass 30 eine geeignete Anzahl von Partitionen ist, wenn Sie 16 Kerne). Nur der Vollständigkeit halber, timed ich den Unterschied auf meinem Rechner (16 Kerne):

data = pd.DataFrame() 
data['col1'] = np.random.normal(size = 1500000) 
data['col2'] = np.random.normal(size = 1500000) 

ddata = dd.from_pandas(data, npartitions=30) 
def myfunc(x,y): return y*(x**2+1) 
def apply_myfunc_to_DF(df): return df.apply((lambda row: myfunc(*row)), axis=1) 
def pandas_apply(): return apply_myfunc_to_DF(data) 
def dask_apply(): return ddata.map_partitions(apply_myfunc_to_DF).compute(get=get) 
def vectorized(): return myfunc(data['col1'], data['col2'] ) 

t_pds = timeit.Timer(lambda: pandas_apply()) 
print(t_pds.timeit(number=1)) 

28,16970546543598

t_dsk = timeit.Timer(lambda: dask_apply()) 
print(t_dsk.timeit(number=1)) 

2,708152851089835

t_vec = timeit.Timer(lambda: vectorized()) 
print(t_vec.timeit(number=1)) 

0,010668013244867325

Giving eine Faktor 10 Speedup von Pandas gehen gelten für DASK auf Partitionen anwenden. Natürlich, wenn Sie eine Funktion haben, die Sie vektorisieren können, sollten Sie - in diesem Fall ist die Funktion (y*(x**2+1)) trivial vektorisiert, aber es gibt viele Dinge, die unmöglich zu vektorisieren sind.

+2

Gut zu wissen, vielen Dank für die Veröffentlichung. Können Sie erklären, warum Sie 30 Partitionen gewählt haben? Ändert sich die Leistung, wenn dieser Wert geändert wird? –

+0

@AndrewL Ich nehme an, dass jede Partition von einem separaten Prozess bedient wird, und mit 16 Kernen nehme ich an, dass entweder 16 oder 32 Prozesse gleichzeitig ausgeführt werden können. Ich habe es ausprobiert, und Leistung scheint bis zu 32 Partitionen zu verbessern, aber weitere Erhöhungen haben keinen nützlichen Effekt. Ich nehme an, dass Sie mit einem Quad-Core-Rechner 8 Partitionen usw. wünschen. Beachten Sie, dass ich eine Verbesserung zwischen 16 und 32 bemerkte, also glaube ich, dass Sie wirklich 2x $ NUM_PROCESSORS wollen –

Verwandte Themen