Python 如何加速字符串连接
我有大约3000000个带有HTML标记的字符串。我正在尝试删除标签并获取内容。但这需要很多时间。有什么方法可以进行并行处理吗?有什么方法可以加快我的实现速度吗Python 如何加速字符串连接,python,multithreading,Python,Multithreading,我有大约3000000个带有HTML标记的字符串。我正在尝试删除标签并获取内容。但这需要很多时间。有什么方法可以进行并行处理吗?有什么方法可以加快我的实现速度吗 from HTMLParser import HTMLParser class MLStripper(HTMLParser): def __init__(self): self.reset() self.fed = [] def handle_data(
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')
在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)
在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)
假设你有一台有8个核的多核计算机。使用Linux bash命令:
split -l 375000 filename
这将为您提供8个文件,每个文件有375000行。文件名将是“xaa”、“xab”、“xac”。。。和“xah”。接下来,在8个较小的文件上运行程序8次(在每个命令末尾使用&)。操作系统应该在不同的内核上并行运行它们。然后将8个输出文件连接成一个结果文件。假设您有一台具有8个核的多核计算机。使用Linux bash命令:
split -l 375000 filename
这将为您提供8个文件,每个文件有375000行。文件名将是“xaa”、“xab”、“xac”。。。和“xah”。接下来,在8个较小的文件上运行程序8次(在每个命令末尾使用&)。操作系统应该在不同的内核上并行运行它们。然后将8个输出文件连接成一个结果文件。进一步回答您关于并行处理的问题:是的,您可以在这里使用它。一个想法是使用map和reduce与ipython mutiprocessing、hadoop、AWS的EMR等一起剥离所有这些字符串,并将它们合并到某个文件或其他输出流中。进一步回答您关于并行处理的问题:是的,您可以在这里使用它。一个想法是使用map和reduce与ipython mutiprocessing、hadoop、AWS的EMR等一起剥离所有这些字符串,并将它们合并到某个文件或其他输出流中。我没有检查下面的代码,但它严格回答了如何并行处理输入的问题。我认为您的代码也可以从其他优化中受益,但请检查其他答案
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()
我没有检查下面的代码,但它严格回答了如何并行处理输入的问题。我认为您的代码也可以从其他优化中受益,但请检查其他答案
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()
300万个字符串,即使每个字符串需要0.1毫秒,也很容易总共需要1000秒……上次我花了半个小时。它们是一些大的弦。300万是全部的一个样本。你需要给出完整的代码,我担心问题不仅仅是你如何加入他们。。。这就是完整的代码。lis是一个列表,其中包含字符串,如hello。你可以试试看,它是有效的。你有没有理由不能将所有数据馈送到一个MLStripper实例中(而不是创建/销毁多个MLStripper实例),然后在最后提取结果。并在MLStripper类中进行处理(例如解码)。你能分享一个数据和预期输出的例子吗…300万个字符串,即使它们每个只需要0.1毫秒,也很容易总共需要1000秒…上次我花了半个小时。它们是一些大的弦。300万是全部的一个样本。你需要给出完整的代码,我担心问题不仅仅是你如何加入他们。。。这就是完整的代码。lis是一个列表,其中包含字符串,如hello。你可以试试看,它是有效的。你有没有理由不能将所有数据馈送到一个MLStripper实例中(而不是创建/销毁多个MLStripper实例),然后在最后提取结果。并在MLStripper类中进行处理(例如解码)。你能分享一个数据和预期输出的例子吗?问题要求多重处理。问题要求多重处理。