Python中更快的缩编技术

Shi*_*ngh 5 python performance nltk lemmatization python-3.x

我试图找到一种使用NLTK Word Net Lemmatizer 对列表中的单词(命名为text)进行词素化的更快方法。显然,这是我整个程序中最耗时的步骤(使用cProfiler查找相同的步骤)。

以下是我正在尝试优化速度的一段代码-

def lemmed(text):
    l = len(text)
    i = 0
    wnl = WordNetLemmatizer()
    while (i<l):
        text[i] = wnl.lemmatize(text[i])
        i = i + 1
    return text
Run Code Online (Sandbox Code Playgroud)

使用lemmatizer会使我的性能降低20倍。任何帮助,将不胜感激。

Ale*_*lec 8

如果您有几个内核可用,请尝试使用该multiprocessing库:

from nltk import WordNetLemmatizer
from multiprocessing import Pool

def lemmed(text, cores=6): # tweak cores as needed
    with Pool(processes=cores) as pool:
        wnl = WordNetLemmatizer()
        result = pool.map(wnl.lemmatize, text)
    return result


sample_text = ['tests', 'friends', 'hello'] * (10 ** 6)

lemmed_text = lemmed(sample_text)

assert len(sample_text) == len(lemmed_text) == (10 ** 6) * 3

print(lemmed_text[:3])
# => ['test', 'friend', 'hello']
Run Code Online (Sandbox Code Playgroud)

  • 随着内核或线程数量的增加,上下文切换通常会产生性能成本,在这种情况下,执行将阻塞,直到最慢的池完成。您也可能会看到不同的结果,具体取决于进入的数组的大小。一旦您开始使用线程或多个工作线程,事情总是变得更加混乱,这就是为什么在您真正需要它之前保存它总是有帮助的原因! (3认同)
  • 至于加速,直接映射可能提供了对现有变量分配的改进。只要能用,就随它去吧! (2认同)