2015-02-10 74 views
0

我有大約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') 
+1

3百萬字符串,即使它們每次只需要0.1毫秒,也很容易總共需要1000秒... – 2015-02-10 06:22:06

+0

上次花了我半個小時。他們是一些大字符串。 300萬是整個地段的樣本。 – user168983 2015-02-10 06:24:42

+0

您需要提供完整的代碼,恐怕問題不會僅在於您如何加入它們,或者說是針對Feed方式的時間測量。 – 2015-02-10 06:26:03

回答

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) 
+0

問題要求多處理。 – Marichyasana 2015-02-10 09:44:44

1

假設你有一個具有8個內核的多核計算機。使用Linux bash命令:

split -l 375000 filename 

這會給你的8個文件,每個375000線。文件名將是「xaa」,「xab」,「xac」,...和「xah」。接下來,在8個較小的文件上運行您的程序8次(在每個命令的末尾使用&)。操作系統應該在並行的不同內核上運行它們中的每一個。然後將8個輸出文件連接成一個結果文件。

1

爲了進一步回答關於並行處理的問題:是的,你可以在這裏使用它。一個想法是使用ipython mutiprocessing,hadoop,AWS'EMR等來使用map和reduce來去除所有這些字符串,並將它們連接到某個文件或其他輸出流中。

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