Как сделать так, чтобы простые функции max, среднее и выбор данных выполнялись в DASK быстрее, чем PANDAS? - PullRequest
0 голосов
/ 17 февраля 2019

Недавно я изучал Dask и слышал, что он эффективен для памяти и быстрее, чем pandas.

Возможно, он эффективен для памяти, но простой сравнительный анализ дает мне меньшую скорость работы для dask, чем pandas.

Qn: КАК УВЕЛИЧИТЬ СКОРОСТЬ В РАБОТЕ?

Вот настройка:

import numpy as np
import pandas as pd

import dask
import dask.dataframe as dd
import dask.array as da

import time
import seaborn as sns

df = sns.load_dataset('titanic')
df = df = pd.concat([df for _ in range(100)])
print(df.shape)
df.head(2)

def benchmark(func):
    start = time.time()
    func()
    end = time.time()
    print("{0:.4f} seconds for {1}".format((end - start), func.__name__))

ddf = dd.from_pandas(df,npartitions=8)

def get_mean():
    return df['fare'].mean()

def get_mean_dask():
    return ddf['fare'].mean().compute()

def get_max():
    return df['fare'].max()

def get_max_dask():
    return ddf['fare'].max().compute()

def get_sum():
    return df['fare'].sum()

def get_sum_dask():
    return ddf['fare'].sum().compute()

def get_filter():
    return df[df['fare'] > 10.0]

def get_filter_dask():
    return ddf[ddf['fare'] > 10.0].compute()

Тестирование dask vs pandas

for i,func in enumerate([get_mean, get_mean_dask,
            get_max, get_max_dask,
            get_sum, get_sum_dask,
            get_filter, get_filter_dask]):
    benchmark(func)
    if (i+1) %2 == 0:
        print()

Результаты

0.0007 seconds for get_mean
0.0105 seconds for get_mean_dask

0.0006 seconds for get_max
0.0054 seconds for get_max_dask

0.0006 seconds for get_sum
0.0055 seconds for get_sum_dask

0.0022 seconds for get_filter
0.0438 seconds for get_filter_dask

1 Ответ

0 голосов
/ 17 февраля 2019

Dask добавляет накладные расходы на все, что вы делаете, порядка 50us на задачу для потоков до 0,5 мс для распределенного планировщика.Один расчет может состоять из множества задач.Чтобы получить хороший параллелизм и ускорение, и при этом общее время не будет зависеть от накладных расходов, у вас должны быть задачи, которые занимают значительно больше времени, чем накладные расходы.Вот почему Dask нацелен на большие или, по крайней мере, промежуточные данные, которые для фреймов данных могут означать размеры разделов> 100 МБ.(это до рассмотрения GIL и других факторов)

Короче говоря, нет смысла пытаться использовать Dask для чего-то, где общее время с Pandas составляет порядка мс или меньше.Там, где Pandas работает хорошо, используйте Pandas.

From http://docs.dask.org/en/latest/dataframe-performance.html:

Для данных, которые помещаются в RAM, Pandas часто может быть быстрее и проще в использовании, чем Dask DataFrame,Хотя инструменты «больших данных» могут быть интересными, они почти всегда хуже, чем обычные инструменты данных, в то время как они остаются подходящими.

...