python - 加速这个 for 循环 - python

标签 python python-2.7 performance pandas

从我的分析中,我可以看到这个函数需要更多的时间来处理。如何加快这段代码的速度?我的数据集有超过一百万条记录,我在这里给出的这个停用词列表只是一个示例 - 它实际上包含 150 个单词。

def remove_if_name_v1(s):
    stopwords = ('western spring','western sprin','western spri','western spr','western sp','western s',
                 'grey lynn','grey lyn','grey ly','grey l')
    for word in stopwords:
        s = re.sub(r'(' + word + r'.*?|.*?)\b' + word + r'\b', r'\1', s.lower(), 1)
    return s.title()

test.new_name = test.old_name.apply(lambda x: remove_if_name_v2(x) if pd.notnull(x) else x)

似乎该函数针对数据帧中的每一行运行,并且在每一行中,它运行 for 循环的次数与停用词的次数相同。有没有其他方法?

我在这里尝试做的是示例,如果字符串包含“western spring road west spring”,则该函数将返回“western spring road”。

谢谢。

最佳答案

您可以组合并预编译正则表达式以获得相当大的改进。

stopwords = ('western spring',
             'western sprin',
             'western spri',
             'western spr',
             'western sp',
             'western s',
             'grey lynn',
             'grey lyn',
             'grey ly',
             'grey l')

pat = re.compile(r'(?P<repl>(?P<word>{stopwords}).*?|.*?)\b(?P=word)\b'.format(
                 stopwords='|'.join(re.escape(s) for s in stopwords)))

test.old_name.str.replace(pat, '\g<repl>')

注意(?P=word)反向引用。我还使用了 Series.str.replace 而不是 Series.apply,后者稍微干净一些。

关于python - 加速这个 for 循环 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45092752/

相关文章:

python - 如何将 PyTorch 张量列表转换为 float 列表?

Android:通过使用 NDK 和轮询提高传感器采样率

python - Pandas - 根据列值创建重复行,给定该列的阈值

python - 带有 Python3 和 Gtk3 的 MVC

python - ### 在使用 Python 创建的 Excel 中打开 CSV 文件时的字符

python - 计算一次,缓存结果,并从缓存中无限返回的函数(Python)

python - 调用对象的状态特定代码块的最有效方法是什么?

java - 跨主机名并行下载

python - 在Python中将字典保存到文件(替代pickle)?

python-2.7 - 更高效的本福德定律代码?