Python 如何加速字符串连接

Python 如何加速字符串连接,python,multithreading,Python,Multithreading,我有大约3000000个带有HTML标记的字符串。我正在尝试删除标签并获取内容。但这需要很多时间。有什么方法可以进行并行处理吗?有什么方法可以加快我的实现速度吗 from HTMLParser import HTMLParser class MLStripper(HTMLParser): def __init__(self): self.reset() self.fed = [] def handle_data(

我有大约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')

在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类中进行处理(例如解码)。你能分享一个数据和预期输出的例子吗?问题要求多重处理。问题要求多重处理。