0

我有以下数据集(具有不同的值,只是乘以相同的行)。我需要组合这些列并对它们进行哈希处理,特别是使用库 hashlib 和提供的算法。

问题是它花费的时间太长,不知何故我觉得我可以对函数进行矢量化,但我不是专家。

该功能非常简单,我觉得它可以矢量化,但很难实现。

我正在处理数百万行,即使散列 4 列值也需要数小时。

import pandas as pd
import hashlib

data = pd.DataFrame({'first_identifier':['ALP1x','RDX2b']* 100000,'second_identifier':['RED413','BLU031']* 100000})

def _mutate_hash(row):
    return hashlib.md5(row.sum().lower().encode()).hexdigest()

%timeit data['row_hash']=data.apply(_mutate_hash,axis=1)

4

2 回答 2

1

使用列表推导可以显着加快速度。

首先是您的原件:

import pandas as pd
import hashlib

n = 100000
data = pd.DataFrame({'first_identifier':['ALP1x','RDX2b']* n,'second_identifier':['RED413','BLU031']* n})

def _mutate_hash(row):
    return hashlib.md5(row.sum().lower().encode()).hexdigest()

%timeit data['row_hash']=data.apply(_mutate_hash,axis=1)

1 loop, best of 5: 26.1 s per loop

然后作为列表理解:

data = pd.DataFrame({'first_identifier':['ALP1x','RDX2b']* n,'second_identifier':['RED413','BLU031']* n})

def list_comp(df):
    return pd.Series([ _mutate_hash(row) for row in df.to_numpy() ])

%timeit data['row_hash']=list_comp(data)

1 loop, best of 5: 872 ms per loop

...即,加速约 30 倍。

作为检查:您可以通过将第一个方法放在“data2”中,将第二个方法放在“data3”中来检查这两种方法是否产生相同的结果,然后检查它们是否相等:

data2, data3 = pd.DataFrame([]), pd.DataFrame([])
%timeit data2['row_hash']=data.apply(_mutate_hash,axis=1)
...
%timeit data3['row_hash']=list_comp(data)
...
data2.equals(data3)
True
于 2021-09-08T01:06:25.117 回答
1

最简单的性能提升来自使用矢量化字符串操作。如果您在应用哈希函数之前进行字符串准备(小写和编码),您的性能会更加合理。

data = pd.DataFrame(
    {
        "first_identifier": ["ALP1x", "RDX2b"] * 1000000,
        "second_identifier": ["RED413", "BLU031"] * 1000000,
    }
)



def _mutate_hash(row):
    return hashlib.md5(row).hexdigest()


prepped_data = data.apply(lambda col: col.str.lower().str.encode("utf8")).sum(axis=1)

data["row_hash"] = prepped_data.map(_mutate_hash)

我看到这种变化可以提高约 25 倍的速度。

于 2021-09-08T01:13:42.840 回答