【发布时间】:2019-01-10 17:15:36
【问题描述】:
我正在尝试加快我的代码速度并提高我对 Dask 和 Numba 的理解,我确实尝试在我创建的一些示例中同时使用这两种方法,但没有任何改进,我不明白为什么。
我必须说我使用的是具有四核的笔记本电脑,因此改进可能不会很大,但它应该在那里。
更准确地说是在 Windows 10 笔记本电脑上,使用 Python 3.7 并在 conda 环境中使用 Numba 和 Dask。
这是我的代码:
import numpy as np
import pandas as pd
from numba import jit
import dask.dataframe as dd
data = np.random.randint(-10, 10, (10**8, 3))
df = pd.DataFrame(data=data, columns=["A", "B", "C"], index=None)
df["F"] = np.random.choice(["apple", "banana", "orange",
"pear","grape","lime","citrus","peach"],10**8)
正如您所见,这是一个相当大的数据帧内存,这是我检查 Dask 是否代表改进的方法。在较小的数据帧(
ddf = dd.from_pandas(df,npartitions=12)
@jit
def remove_special_char_with_numba(x):
return x.replace('r','')
这是一个玩具示例,我尝试从特定列中删除字符串,与原版 Pandas 相比,Numba 确实加快了代码速度,但不支持字符串,因此我无法修改 替换或使用 nopython 模式。 现在:
%%timeit
remove_special_char_with_numba(df["F"])
输出:
每个循环 58.9 秒 ± 9.51 秒(7 次运行的平均值 ± 标准偏差,每次 1 个循环)
接下来,我对以下内容的理解是,Dask 将我的数据帧分成不同的块/分区,并且它将独立地将函数应用于每个分离的块。据我了解,它有四个核心,应该可以加快进程。
%%timeit
ddf["F"].map_partitions(remove_special_char_with_numba).compute()
输出:
每个循环 45.9 s ± 10.5 s(平均值 ± 标准偏差,7 次运行,每次 1 个循环)
现在我不想贪心,但改进不应该比这更大吗?我是不是做错了什么?
谢谢
【问题讨论】:
标签: python python-3.x dask numba