我有大约3000000个带HTML标签的字符串。我正在尝试删除标记并获取内容。我有以下方式的代码。但这需要花费很多时间。有什么方法可以做并行处理吗?我可以用任何方式加快实施速度吗?
from HTMLParser import HTMLParser
class MLStripper(HTMLParser):
def __init__(self):
self.reset()
self.fed = []
def handle_data(self, d):
self.fed.append(d)
def get_data(self):
return ''.join(self.fed)
def strip_tags(html):
s = MLStripper()
s.feed(html)
return s.get_data()
for each in lis:
if each != None:
each = strip_tags(each)
st+=" "+each.decode('utf-8')
答案 0 :(得分:2)
在for循环中执行字符串连接会产生问题,因为需要为每个连接创建一个新的字符串对象(在您的情况下,每次迭代循环两次)。
您可以使用连接和生成器来提高效率。
for each in lis:
if each != None:
each = strip_tags(each)
st+=" "+each.decode('utf-8')
变为:
st = " ".join(strip_tags(each).decode('utf-8') for each in lis if each is not None)
答案 1 :(得分:1)
假设您有一台具有8个核心的多核计算机。使用Linux bash命令:
split -l 375000 filename
这将为您提供8个文件,每个文件包含375000行。文件名将是" xaa"," xab"," xac",...和" xah"。接下来,在8个较小的文件上运行您的程序8次(使用&在每个命令的末尾)。操作系统应该在不同的核心上并行运行它们。然后将8个输出文件连接成一个结果文件。
答案 2 :(得分:1)
进一步回答关于并行处理的问题:是的,你可以在这里使用它。一个想法是使用map和reduce进行ipython多处理,hadoop,AWS' EMR等删除所有这些字符串并将它们连接成一些文件或其他输出流。
答案 3 :(得分:1)
我没有检查下面的代码,但它严格回答了如何并行处理输入的问题。我认为您的代码也可以从其他优化中受益,但请检查其他答案。
from HTMLParser import HTMLParser
from multiprocessing import Pool
class MLStripper(HTMLParser):
def __init__(self):
self.reset()
self.fed = []
def handle_data(self, d):
self.fed.append(d)
def get_data(self):
return ''.join(self.fed)
def strip_tags(html):
s = MLStripper()
s.feed(html)
return s.get_data()
if __name__ == '__main__':
lis=[]#you should get lis contents here
pool = Pool()
pool.map(strip_tags, (each for each in lis if each !=None))
pool.close()
pool.join()