Python3.X系で、文字列を高速に置換する方法を試行錯誤しておりますが、中々高速化が出来ません。
CPUで並列計算させることはできるのですが、これ以上速度を上げる方法はないでしょうか?
実際には100万件くらいのデータと、辞書が20万語ほどあるデータを置換するプログラムを組んでいます。
環境:Azure VM NV6インスタンス(Vm cpu:6core)
試した方法
Python
1#replaceを使った方法 2import random 3import time 4from tqdm import tqdm 5 6def replacer(text,replace_list): 7 rtn_val = "" 8 for item in replace_list: 9 rtn_val = text.replace(item,"") #置換後文字は、空白(文章の一部を削除したい 10 return rtn_val 11 12 13 14text_list = ["あいうえお、かきくけこ、さしすせそ!"]* 10000 15replace_list =["あい" + str(random.random()) for _ in range(10000)] #わざと乱数をつけて、辞書の数を多くする 16replace_list += ["あい"] 17start = time.time() 18#replaced_list = [replacer(sentence,replace_list) for sentence in text_list] 19replaced_list = [replacer(sentence,replace_list) for sentence in tqdm(text_list)] #tqdmで可視化用 20process_time = time.time() - start 21print(process_time) 22 23100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10000/10000 [00:33<00:00, 294.98it/s] 2433.90771460533142
re.subを使った、方法でも試しましたが、遅いです。
Python
1import random 2import time 3import re 4from tqdm import tqdm 5def trans_word2(text,replace_dict): 6 return re.sub('({})'.format('|'.join(map(re.escape, replace_dict.keys()))), lambda m: replace_dict[m.group()], text) 7 8 9text_list = ["あいうえお、かきくけこ、さしすせそ!"]* 10000 10replace_list = ["あい" + str(random.random()) for _ in range(10000)] #わざと乱数をつけて、辞書の数を多くする 11replace_dict =dict([(item,"") for item in replace_list]) 12replace_dict["あい"] = "" 13start = time.time() 14replaced_list = [trans_word2(sentence,replace_dict) for sentence in tqdm(text_list)] #tqdmで可視化用 15process_time = time.time() - start 16print(process_time) 17 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 10000/10000 [12:59<00:00, 12.71it/s] 18779.81234680347942
ご教授のほどよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー