如何提升CSV文件跨语言翻译的代码运行效率?
问题:优化CSV翻译转换代码的耗时问题
我的实现方案
将CSV文件转换为XML格式,翻译为目标语言后再转回CSV格式。
原代码
import pandas as pd import xml.etree.ElementTree as ET from googletrans import Translator import xml.etree.ElementTree as ETree import pandas as pd import csv #csv to xml df= pd.read_csv('Salary Dataset.csv') with open('outputf.xml', 'w') as myfile: myfile.write(df.to_xml()) tree = ET.parse('outputf.xml') for elem in tree.iter(): #print(elem.tag, elem.text) if(elem.text): translator=Translator() translation=translator.translate(elem.text,dest="fr").text #elem.text.replace(elem.text,translation) elem.text=translation #print(elem.text) tree.write('outputfr.xml', xml_declaration=True, method='xml', encoding="utf8") xmlp = ETree.XMLParser(encoding="utf-8") Tree = ETree.parse('outputf.xml',parser=xmlp) #Hit and trial methods #xml='/content/output.xml' #xmltest = ET.fromstring(xml.encode("utf-8")) #Tree = ETree.parse(xmltest) #Tree = ETree.parse('/content/outputfr.xml') root = Tree.getroot() A=[] for ele in root: B = {} for i in list(ele): B.update({i.tag: i.text}) A.append(B) df = pd.DataFrame(A) df.drop_duplicates(keep='first', inplace=True) df.reset_index(drop=True, inplace=True) writer = csv.writer(open('600.csv', 'w')) df.to_csv('600.csv') print("XML FILE CONVERTED SUCESSFULLY")
性能问题
当前该代码运行耗时超过25分钟,其中翻译函数的调用是主要耗时环节,请问有什么方法可以降低这段代码的时间复杂度?
示例数据
| 公司 | 职位 | 薪资样本数 | 地点 | 薪资 |
|---|---|---|---|---|
| MU Sigma | 数据科学家 | 105 | 班加罗尔 | ₹6,43,232/年 |
| IBM | 数据科学家 | 125 | 班加罗尔 | ₹6,21,651/年 |
| TATA | 数据科学家 | 200 | 班加罗尔 | ₹3,67,282/年 |
| Flipkart | 数据科学家 | 100 | 班加罗尔 | ₹8,90,567/年 |
| Amazon | 数据科学家 | 90 | 班加罗尔 | ₹5,45,521/年 |
优化方案及代码
核心优化点
- 复用翻译客户端:避免在循环内重复创建
Translator实例,减少初始化开销 - 批量翻译+缓存结果:收集所有需要翻译的去重文本,批量调用翻译接口,同时缓存结果避免重复翻译相同内容
- 跳过不必要的翻译:数字、公司名、薪资格式这类无需翻译的内容直接保留
- 移除XML中转:直接操作DataFrame,省去XML文件的IO和解析步骤
优化后代码
import pandas as pd from googletrans import Translator # 只初始化一次翻译器,避免重复开销 translator = Translator() # 直接读取CSV,跳过XML中转步骤 df = pd.read_csv('Salary Dataset.csv') # 指定需要翻译的列(只翻译文本型字段) target_cols = ['职位', '地点'] # 收集所有需要翻译的去重文本,减少重复翻译请求 unique_texts = [] for col in target_cols: unique_texts.extend(df[col].drop_duplicates().tolist()) # 批量翻译(处理接口长度限制,分块执行) translation_cache = {} chunk_size = 100 # 根据接口限制调整 for i in range(0, len(unique_texts), chunk_size): chunk = unique_texts[i:i+chunk_size] translations = translator.translate(chunk, dest="fr") # 构建翻译映射表 for src_text, trans_result in zip(chunk, translations): translation_cache[src_text] = trans_result.text # 将翻译结果映射回DataFrame for col in target_cols: df[col] = df[col].map(translation_cache) # 保存最终结果 df.to_csv('600_fr.csv', index=False) print("翻译完成,结果已保存")
优化效果说明
- 批量翻译将数十/数百次HTTP请求合并为几次,直接解决网络请求的耗时瓶颈
- 缓存去重文本,避免重复翻译相同内容(比如示例中“数据科学家”重复5次,只翻译1次)
- 移除XML中转,省去文件读写和XML解析的额外时间开销
- 只翻译需要的字段,避免对数字、格式文本做无效翻译
内容的提问来源于stack exchange,提问作者Hiralal Umesh Kumhar
相关产品推荐
相关产品推荐

