如何加快字符串连接速度

时间:2015-02-10 06:18:08

标签: python multithreading

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

4 个答案:

答案 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()