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.
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? –
@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 –