我在并行化groupby时找到了这个question。但是,它不能一对一地翻译成有多个参数的情况 - 除非我弄错了。
以下是正确的做法吗?有没有更好的办法? (特别是索引看起来效率很低)。
db.execSQL("create studentTable "+studentTable+"(Id Integer primary key, Name text, Department text, Marks Integer)");
使用ArticleFormSet = formset_factory(ArticleForm)
if request.method == 'POST':
formset = ArticleFormSet(request.POST, request.FILES)
调用哪个。
答案 0 :(得分:2)
首先请注意,除非您的数据相当大,否则您可能看不到很多(或任何)并行化的好处。
而不是直接使用多处理池,现在最简单的方法是尝试dask
- 它给出了类似熊猫的api,主要是为你管理并行性。
df = pd.DataFrame(np.random.randn(10000000, 10), columns=list('qwertyuiop'))
df['key'] = np.random.randint(0, 100, size=len(df))
import dask.dataframe as dd
# want a partition size small enough to easily fit into memory
# but large enough to make the overhead worth it
ddf = dd.from_pandas(df, npartitions=4)
%timeit df.groupby('key').sum()
1 loop, best of 3: 1.05 s per loop
# calculated in parallel on the 4 partitions
%timeit ddf.groupby('key').sum().compute()
1 loop, best of 3: 695 ms per loop
请注意,默认情况下,dask对数据帧使用基于线程的调度程序,对于释放GIL的sum
等函数来说速度更快。如果您正在应用自定义python函数(需要GIL),那么您可以通过多处理计划看到更好的性能。
dask.set_options(get=dask.multiprocessing.get)
答案 1 :(得分:0)
您可以使用以下版本。 Python functool提供了部分功能,可以帮助您做到这一点。
from functools import partial
def applyParallel(dfGrouped, func, *args):
p=Pool(cpu_count())
result=p.map(partial(func, *args), [group for name, group in dfGrouped])
p.close()