回答这个问题时,我想到了如何使用非向量化函数加速处理以 Pandas Series / DataFrame 形式呈现的数据,而且我们无法更改。
在这个问题中,数据处理包括使用natasha.
创建我们要加速的函数的代码是:
from natasha import MorphVocab, AddrExtractor
morph_vocab = MorphVocab()
addr_extractor = AddrExtractor(morph_vocab)
PART_TYPES = [
"индекс", "город",
"улица", "проспект", "шоссе", "переулок", "проезд",
"дом", "корпус"
]
def parse_addr(
addr_str,
addr_extractor=addr_extractor,
min_addr_len=10
):
if not addr_str or len(str(addr_str)) < min_addr_len:
return None
ext = addr_extractor.find(addr_str)
if not ext:
return None
return {part.type: part.value for part in ext.fact.parts}
def combine_addr_str(parsed_addr, part_types=PART_TYPES):
if not parsed_addr:
return None
return " ".join(
parsed_addr[part_type]
for part_type in part_types
if parsed_addr.get(part_type)
)
def get_addr_str(addr_str):
return combine_addr_str(parse_addr(addr_str))
该任务的目的不是为了并行化而并行化,而是加速调用一个接受并返回标量值的函数到pandas.Series/ pandas.DataFrame。
链接到示例数据- Excel 文件包含从该问题的示例数据中获取的 200 个随机地址
要将数据读入 Pandas DataFrame:
import pandas as pd
filename = "/tmp/sample.xlsx" # NOTE:у кажите правильный путь к файлу!
df = pd.read_excel(filename)
建议您的解决方案!
我自己尝试在 MacBook Pro(处理器:2.6 GHz 6-Core Intel Core i7)上找到最佳解决方案:
次要功能:
不同解决方案的性能比较: