可能在许多内核上运行进程导致python中的性能降低?

时间:2016-11-30 11:56:35

标签: python multithreading nltk

我有这样的代码;

import codecs, nltk

from nltk import *
from threading import Thread
#from textblob import TextBlob

def write_tags(file_name, corpus, no):
    print "Writing to tokens" + no + ".tr ..."
    target = open(file_name, "w")
    lencorpus = len(corpus)
    for d in range(lencorpus):
        text = word_tokenize(corpus[d].replace("\n", ""))
        line = ""
        for e in range(len(text)):
            line += text[e] + " "
        line = line[:-1] + "\n"
        target.write(line.encode("utf-8"))
    target.close()
    print "tokens" + no + ".tr is written ..."


def chunkIt(seq, num):
    avg = len(seq) / float(num)
    out = []
    last = 0.0

    while last < len(seq):
            out.append(seq[int(last):int(last + avg)])
            last += avg

    return out

if __name__ == "__main__":

    print "Importing corpus ..."
    f = codecs.open("../corpus/corpus2.tr", encoding="utf-8").readlines()

    print "Splitting corpus to 32 parts ..."
    all_corpus = chunkIt(f, 32)

    print "Writing tags to file ..."
    thread_list = []
    for a in range(32):
        file_name = "../corpus/tokens" + str(a) + ".tr"
        thread = Thread(target=write_tags, args=(file_name, all_corpus[a], str(a)))
        thread_list.append(thread)

    for b in range(32):
        thread_list[b].start()

    for c in range(32):
        thread_list[c].join()

    print "Merging files ..."
    target = open("../corpus/tokens.tr", "w")
    for d in range(32):
        file_name = "../corpus/tokens" + str(d) + ".tr"
        f = codecs.open(file_name, encoding="utf-8").read()
        target.write(f.encode("utf-8"))
        print "tokens" + str(d)
    target.close()

基本上,我想要对给定文本文件中的句子进行标记,该文件涉及超过37 M的句子。由于我使用nltk库进行标记化,因此完成此过程需要1天以上的时间。

出于这个原因,我决定进行多线程处理,所以基本上我将给定的文本文件分成32个部分,然后并行处理它们。

但似乎多线程不会改变速度。

我的进程是否因为我在多线程中使用了很多内核而变慢了?可能减少核心数量会带来更好的性能吗?

1 个答案:

答案 0 :(得分:2)

threading模块不会利用多个处理核心,它只会在一个核心上的同一进程中的线程之间共享时间。如果您希望将处理扩展到多个核心(很可能减少程序执行的总时间),则multiprocessing package就是您要使用的。