我有这样的代码;
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个部分,然后并行处理它们。
但似乎多线程不会改变速度。
我的进程是否因为我在多线程中使用了很多内核而变慢了?可能减少核心数量会带来更好的性能吗?
答案 0 :(得分:2)
threading
模块不会利用多个处理核心,它只会在一个核心上的同一进程中的线程之间共享时间。如果您希望将处理扩展到多个核心(很可能将减少程序执行的总时间),则multiprocessing package就是您要使用的。