在多核机器上加速 Pandas

All*_*len 6 multithreading python-3.x pandas

我有一个适合内存的熊猫数据框。我在数据框上做了 serval 映射,但是由于传递给 map 的回调函数的复杂性,每个映射都很耗时。我拥有一个 AWS C4 实例,它是 8 核和 16GB-RAM。我在机器上运行python脚本,发现80%以上的CPU时间是空闲的。所以,我认为(如果我不对,请纠正我)python 脚本是单线程的,并且只消耗 1 个内核。有没有办法在多核机器上加速熊猫?这是两张耗时的地图的片段

 tfidf_features = df.apply(lambda r: compute_tfidf_features(r.q1_tfidf_bow, r.q2_tfidf_bow), axis=1)
 bin_features = df.apply(lambda r: compute_bin_features(r.q1_bin_bow, r.q2_bin_bow), axis=1)
Run Code Online (Sandbox Code Playgroud)

这是compute_tfidf_features函数

def compute_tfidf_features(sparse1, sparse2):
    nparray1 = sparse1.toarray()[0]
    nparray2 = sparse2.toarray()[0]

    features = pd.Series({
    'bow_tfidf_sum1': np.sum(sparse1),
    'bow_tfidf_sum2': np.sum(sparse2),
    'bow_tfidf_mean1': np.mean(sparse1),
    'bow_tfidf_mean2': np.mean(sparse2),
    'bow_tfidf_cosine': cosine(nparray1, nparray2),
    'bow_tfidf_jaccard': real_jaccard(nparray1, nparray2),
    'bow_tfidf_sym_kl_divergence': sym_kl_div(nparray1, nparray2),
    'bow_tfidf_pearson': pearsonr(nparray1, nparray2)[0]
    })

    return features
Run Code Online (Sandbox Code Playgroud)

我知道一个名为 dask 的 python 库,但它表示它不适用于可以轻松放入内存的数据框。

Eil*_*sen 5

熊猫不支持这一点。Dask数组主要与 Pandas API 兼容,并支持apply.

您还可以考虑一些前沿解决方案,例如这个新工具