我有一个大的txt文件(大约20GB),我想替换此大文件中单词列表的所有实例。我正在努力寻找一种优化此代码的方法。这导致我长时间处理此文件。

我可以改善什么?

corpus_input = open(corpus_in,"rt")

corpus_out = open(corpus_out,"wt")

for line in corpus_input:

temp_str=line

for word in dict_keys:

if word in line:

new_word = word+"_lauren_ipsum"

temp_str = re.sub(fr'\b{word}\b',new_word,temp_str)

else:

continue

corpus_out.writelines(temp_str)

corpus_input.close()

corpus_out.close()

解决方案

优化最重要的事情是了解性能到底是什么。然后,您可以看到可以优化的内容。

例如,如果读写花费了99%的时间,那么优化数据处理就不值得了。即使您可以将处理速度提高10倍,如果阅读消耗了99%,您也只能获得0.9%的收益。

我建议测量和比较一些版本,并发布性能差异。这可能会导致进一步的建议变得乐观。

在所有下面的示例我换成writelines与write作为writelines可能是由汉字书写之前,您分解行字符。

任何状况之下。您想使用write您应该已经获得了大约5的加速。

1.)只是阅读和写作

with open(corpus_in,"rt") as corpus_input, open(corpus_out,"wt")

as corpus_out:

for line in corpus_input:

corpus_out.write(line)

2.)只需使用更大的缓冲区进行读写

import io

BUF_SIZE = 50 * io.DEFAULT_BUFFER_SIZE # try other buffer sizes if you see an impact

with open(corpus_in,"rt", BUF_SIZE) as corpus_input, open(corpus_out,"wt", BUF_SIZE)

as corpus_out:

for line in corpus_input:

corpus_out.write(line)

对我来说,这可以将性能提高百分之几

3.)将搜索正则表达式和替换生成移出循环。

rules = []

for word in dict_keys:

rules.append((re.compile(fr'\b{word}\b'), word + "_lorem_ipsum"))

for line in corpus_input:

for regexp, new_word in rules:

line = regexp.sub(new_word, line)

corpus_out.write(line)

在我的机器上,我的行频包含单词,这种解决方法实际上比包含行的解决方案要慢if word in line

因此,也许可以尝试:3.a)将搜索正则表达式和替换生成移出循环。

rules = []

for word in dict_keys:

rules.append((word, re.compile(fr'\b{word}\b'), word + "_lorem_ipsum"))

for line in corpus_input:

for word, regexp, new_word in rules:

if word in line:

line = regexp.sub(new_word, line)

corpus_out.write(line)

3.b)如果所有替换字符串都比初始字符串长,则速度会更快一些。

rules = []

for word in dict_keys:

rules.append((word, re.compile(fr'\b{word}\b'), word + "_lorem_ipsum"))

for line in corpus_input:

temp_line = line

for word, regexp, new_word in rules:

if word in line:

temp_line = regexp.sub(new_word, temp_line)

corpus_out.write(temp_line)

4.)如果您真的总是word + "_lorem_ipsum"将正则表达式合并为一个替换。

regexp = re.compile(fr'\b({"|".join(dict_keys)})\b')

for line in corpus_input:

line = regexp.sub("\1_lorem_ipsum", line)

corpus_out.write(line)

4.a)取决于单词分布,这可能会更快:

regexp = re.compile(fr'\b({"|".join(dict_keys)})\b')

for line in corpus_input:

if any(word in line for word in dict_keys):

line = regexp.sub("\1_lorem_ipsum", line)

corpus_out.write(line)

这是否更有效可能取决于要搜索和替换的单词数以及此单词的频率。我没有那个日期。

5个单词,我的分布慢于3.a

5)如果要替换的单词不同,您仍然可以尝试组合正则表达式并使用函数来替换

replace_table = {

"word1": "word1_laram_apsam",

"word2": "word2_lerem_epsem",

"word3": "word3_lorom_opsom",

}

def repl(match):

return replace_table[match.group(1)]

regexp = re.compile(fr'\b({"|".join(dict_keys)})\b')

for line in corpus_input:

line = regexp.sub(repl, line)

corpus_out.write(line)

Slower than 5, whether better than 3.a depends on number of words and wird distribution / frequency.

python替换文本文件单词_在大型文本文件中替换一组单词相关推荐

  1. python 替换文本 通配符_使用通配符搜索和替换文本文件中的字符串

    尝试在python中对文本文件的内容使用通配符进行搜索/替换: 如果文本文件的内容看起来像:"all_bcar_v0038.ma"; "all_bcar_v0002.ma ...

  2. hubliderx如选择相同单词_高考英语,十六种高效单词记忆法,建议人手一份!

    词汇,无疑是高考英语成败的决定性因素.每位高中生,对词汇的掌握和记忆都不该有丝毫懈怠.西面是豆哥即将高考的同学们整理出来的十六种高效单词记忆法,一定要收藏起来好好学.好好记哦! 更多学习资料以及答题技 ...

  3. matlab把句子分割成单词_将句子拆分成单独的单词 - php

    我需要将中文句子拆分为单独的单词.中文的问题是没有空格.例如,该句子可能看起来像:主楼怎么走(带空格的是:主楼 怎么 走). 目前,我可以想到一种解决方案.我有一本有中文单词的字典(在数据库中).该脚 ...

  4. python 运行r语言_如何在R中运行Python

    python 运行r语言 尽管我很喜欢R,但很显然Python还是一种很棒的语言-既适用于数据科学又适用于通用计算. R用户想要在Python中做一些事情可能有充分的理由. 也许这是一个很棒的库,还没 ...

  5. python输入英文句子、找最长单词_在输入fi中找出句子中的最大和最小单词数

    我有一个问题,要求我找出文本文件中单词的最小和最大数量.我已经完成了五个问题中的三个,剩下的两个是关于最小值和最大值的问题,我对此没有任何解决办法.以下是我的代码:感谢您的帮助lines, blank ...

  6. python能熔断吗_在大型项目上,Python 是个烂语言吗?

    python工作一年,目前写过最大的项目,代码量2W左右,后端+爬虫. try: 优点:开发效率够快,社区活跃,三方库丰富,语法简单清晰(同步代码初阶),有大量的作业可以抄(你遇到的绝大部分问题已经有 ...

  7. python队列中替换某元素_如何打印队列中的元素(Python)

    试试这个:class LinkedQueue : class _Node : def __init__(self, element, next): self._element = element se ...

  8. python输出以元音字母开头的单词_开头是元音字母的英语单词有哪些?

    展开全部 1.前元音[i:],[I],[e],[æ]的发音特点 A.舌尖抵住下齿. B.舌前部向硬颚抬e5a48de588b662616964757a686964616f31333365643539起 ...

  9. python英语词汇读音_美式英语和英式英语音标单词发音差异区别大全

    BrE AmE Words / ɑː/ /æ / Excluding words changed by the trap – bath split , [57] (which affects most ...

最新文章

  1. 差分约束系统——建模与求解
  2. lzw编码过程详解_编码拓展——封装、编码、码率
  3. 免费和开源世界里面有很多好的邮件服务器
  4. Postfix 队列清理
  5. LeetCode 1025. 除数博弈(动态规划)
  6. 图解TCP/IP读书笔记(三)
  7. 第二场周赛(递归递推个人Rank赛)——题解
  8. 【报告分享】新基建风口下,零售科技企业如何借势发展.pdf(附下载链接)
  9. 洛谷P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
  10. 基于GCN的推荐该怎么搞?
  11. 自己的域名邮箱用GMAIL:申请注册GMAIL的免费企业邮箱
  12. 北大计算机陈旭,北大图灵班——欢迎来到计算机王国
  13. 致远OA办公网“office控件不可用”及“无注册表类”解决办法
  14. Mybatis使用order by语句
  15. 08矩阵加法httpwww.noi.openjudge.cn
  16. linux 查找py文件命令_Linux文件查找
  17. Mediawiki页面权限设置 禁止游客编辑 禁止注册
  18. SMAP数据产品介绍与下载方法
  19. 主机和虚拟机之间不能互通解决办法
  20. 计算机课翻译成英语,计算机课程英文翻译

热门文章

  1. el table怎么获取最后一行_elementUi表格插入额外一行怎么操作
  2. java 空语句_Java空语句怎么写才正确?这样的Java基础知识才是你需要的
  3. php如何实现根据地区内筛选,PHP区块查询实现方法分析
  4. python一行没写完用什么隔离_完全隔离的Python环境
  5. Linux操作系统安装LAMP环境
  6. Windows下通过FTP自动备份数据到服务器并删除指定天数前的备份
  7. Typecho程序伪静态规则大全(包括Linux/Windows
  8. Luogu4099 HEOI2013 SAO 组合、树形DP
  9. BZOJ3230 相似子串 字符串 SA ST表
  10. 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理