python怎么增加线程跑得更快,大神在哪里

# -*- coding: UTF-8 -*-
import re


fo = open("1.txt", "r");
co = open("2.txt", "r");

colines = co.readlines();

for line in fo.readlines():
line = line.strip();
matchObj = re.search( line, "%s" % colines, re.M | re.I);

if matchObj:
print (line);


fo.close();
co.close();

处理的数据太多啦,请问怎么在这个源码的基础上增加线程,让他飞起来,求大神帮助
...全文
1754 42 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 22 楼 NotBack 的回复:
[quote=引用 19 楼 穿袜子的猫和穿靴子的狗 的回复:] ]是的呢,太多词了 手动过不过来,想看看哪些重复的,又不会写 到处抄代码
关键看这2个文件有多大。 一大一小,在大文件中搜寻小文件行? 差不多大,找两个文件中相同的行? [/quote] A文件大概260W行 两个字的词到4个字的词,大小在25M估计。 B文件事25-30个字一行,几万行的样子,不一定,也会修改, 主要是从看B文件里出现的A文件的词有哪些,
notback 2019-05-21
  • 打赏
  • 举报
回复
引用 19 楼 穿袜子的猫和穿靴子的狗 的回复:
]是的呢,太多词了 手动过不过来,想看看哪些重复的,又不会写 到处抄代码
关键看这2个文件有多大。 一大一小,在大文件中搜寻小文件行? 差不多大,找两个文件中相同的行?
  • 打赏
  • 举报
回复
引用 20 楼 NotBack 的回复:
[quote=引用 15 楼 穿袜子的猫和穿靴子的狗 的回复:] 大佬。就在我的代码基础上把r换成rb后报错,这个该怎么办
说中了,re的操作中,如果目标为str,则pattern必须为str。如果目标为bytes,则pattern必须为bytes 。明白问题所在了吧? 用r读出来的是str,用rb读出来的是bytes[/quote]大佬能不能在我的代码上改一下 感觉应该是格式错误的意思吗?但是不知道怎么改
notback 2019-05-21
  • 打赏
  • 举报
回复
引用 15 楼 穿袜子的猫和穿靴子的狗 的回复:
大佬。就在我的代码基础上把r换成rb后报错,这个该怎么办
说中了,re的操作中,如果目标为str,则pattern必须为str。如果目标为bytes,则pattern必须为bytes 。明白问题所在了吧? 用r读出来的是str,用rb读出来的是bytes
  • 打赏
  • 举报
回复
引用 18 楼 NotBack 的回复:
你这个代码估计调试无法通过。 因为 bytes的 re 必须用bytes的patten 再改改re的,"%s"这有问题 如果我记忆没错的话,%s再python3.x的某个x后不支持。另外,搜索bytes,patten 必须用 bytes 也就是 b"" 你这个程序要干嘛? 判断fo的行是否存在于co中吗?
是的呢,太多词了 手动过不过来,想看看哪些重复的,又不会写 到处抄代码
notback 2019-05-21
  • 打赏
  • 举报
回复
你这个代码估计调试无法通过。
因为 bytes的 re 必须用bytes的patten

再改改re的,"%s"这有问题
如果我记忆没错的话,%s再python3.x的某个x后不支持。另外,搜索bytes,patten 必须用
bytes 也就是 b""

你这个程序要干嘛? 判断fo的行是否存在于co中吗?



  • 打赏
  • 举报
回复
引用 13 楼 一笑程序猴 的回复:
[quote=引用 12 楼 穿袜子的猫和穿靴子的狗 的回复:] 妥了大哥,还有最后一个小问题这个代码现在的功能是搜索出重复的 能不能加点什么删点什么变成删除啊,就是A里边是一堆词,苹果,香蕉,梨 西瓜。B文档是句子 我有一个苹果,现在是可以显示出 苹果,能不能改成在B文档中把苹果这个重复词给删除掉,变成我有一个
只能给你个大概思路 这种情况直接在原文件上操作是不大可能的,这时就需要第三个文件C,把内容写到C文件里,不需要做修改的可以直接写进去,需要修改的部分修改后写进去(也就是if里面的内容)。 如果匹配到以后想把某个词删掉,那可以直接用replace函数直接替换成空就可以了 [/quote]好的多谢大佬,我还是从基础入门学习吧 都看不懂呢
  • 打赏
  • 举报
回复
引用 14 楼 NotBack 的回复:
以这个例子来说, 如果txt文件不大,用线程根本无意义 如果txt文件很大,把r改成rb,速度会快上好几倍。 优化方向性错误。 超大文件读取,可以看看我以前写的一个博文。 再python中,线程一般用于io密集型。进程用于cpu密集型。但python的文件读取操作本身效率已经非常高了。 re的字符串操作效率也很高。 所以我说以本例来说,增加线程完全无必要。
# -*- coding: UTF-8 -*-
import re


fo = open("2.txt", "rb");
co = open("n1.txt", "rb");

colines = co.readlines();

for line in fo.readlines():
    line = line.strip();
    matchObj = re.search( line, "%s" %  colines, re.M | re.I);

    if matchObj:
        print (line);


fo.close();
co.close();
这是修改后代码
  • 打赏
  • 举报
回复
引用 14 楼 NotBack 的回复:
以这个例子来说, 如果txt文件不大,用线程根本无意义 如果txt文件很大,把r改成rb,速度会快上好几倍。 优化方向性错误。 超大文件读取,可以看看我以前写的一个博文。 再python中,线程一般用于io密集型。进程用于cpu密集型。但python的文件读取操作本身效率已经非常高了。 re的字符串操作效率也很高。 所以我说以本例来说,增加线程完全无必要。
Traceback (most recent call last):
  File "qq.py", line 12, in <module>
    matchObj = re.search( line, "%s" %  colines, re.M | re.I);
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\re.py", line 183, in search
    return _compile(pattern, flags).search(string)
TypeError: cannot use a bytes pattern on a string-like object
大佬。就在我的代码基础上把r换成rb后报错,这个该怎么办
notback 2019-05-21
  • 打赏
  • 举报
回复
以这个例子来说,
如果txt文件不大,用线程根本无意义
如果txt文件很大,把r改成rb,速度会快上好几倍。

优化方向性错误。

超大文件读取,可以看看我以前写的一个博文。

再python中,线程一般用于io密集型。进程用于cpu密集型。但python的文件读取操作本身效率已经非常高了。
re的字符串操作效率也很高。
所以我说以本例来说,增加线程完全无必要。

  • 打赏
  • 举报
回复
引用 41 楼 NotBack 的回复:
[quote=引用 40 楼 穿袜子的猫和穿靴子的狗 的回复:] 大佬快给我感动哭了,快太多了简直 python可以在这种本身的代码上增加功能吗,比如说我要增加个找到了直接导出到一个TXT文本,或者直接在B文档中删除找到的词,
你这个程序结构,再source中删除比较麻烦,因为你source是作为一个整体在被搜索, 删Source思路: 用 sourceSt.find来查找key,这样可以搜索到第一次出现key的位置。然后用这个位置数对sourceSt做切片,然后查询切片内\r\n的数量,基本上可以定位行数,保存这些行数,最后遍历一遍source.txt文件,就能删除文档中包含了key的行。 删Key思路: 遍历的时候,如果查到不输出到NewKey.txt,如果查不到,输出到NewKey.txt 输出到txt文本: 循环前定义一个list

rsltList = []

print(key.decode('gbk'))
输出时,同时将找到的key保存入List

rsltList.append(key.decode("GBK"))
最后得到一个查找到的rsltList 用with open("rslt.txt","wb") as f: 打开输出文件 f.writelines 可以直接将rsltList保存到文件,注意:如果需要一行一个key,rsltList的每行的\r\n要手动添加给每个item rsltList.appent(f'{key.decode("GBK")}\r\n')[/quote] 好的非常非常感谢大佬,解决了困扰好几天的问题,
notback 2019-05-21
  • 打赏
  • 举报
回复
引用 40 楼 穿袜子的猫和穿靴子的狗 的回复:
大佬快给我感动哭了,快太多了简直 python可以在这种本身的代码上增加功能吗,比如说我要增加个找到了直接导出到一个TXT文本,或者直接在B文档中删除找到的词,
你这个程序结构,再source中删除比较麻烦,因为你source是作为一个整体在被搜索, 删Source思路: 用 sourceSt.find来查找key,这样可以搜索到第一次出现key的位置。然后用这个位置数对sourceSt做切片,然后查询切片内\r\n的数量,基本上可以定位行数,保存这些行数,最后遍历一遍source.txt文件,就能删除文档中包含了key的行。 删Key思路: 遍历的时候,如果查到不输出到NewKey.txt,如果查不到,输出到NewKey.txt 输出到txt文本: 循环前定义一个list

rsltList = []

print(key.decode('gbk'))
输出时,同时将找到的key保存入List

rsltList.append(key.decode("GBK"))
最后得到一个查找到的rsltList 用with open("rslt.txt","wb") as f: 打开输出文件 f.writelines 可以直接将rsltList保存到文件,注意:如果需要一行一个key,rsltList的每行的\r\n要手动添加给每个item rsltList.appent(f'{key.decode("GBK")}\r\n')
  • 打赏
  • 举报
回复
引用 39 楼 NotBack 的回复:
[quote=引用 38 楼 穿袜子的猫和穿靴子的狗 的回复:] 太刺激了,这个弄完我也要好好学习python,非常非常感谢大佬耐心解答,

with open("source.txt", "rb")as f:
    source = f.readlines()
sourceSt = b"".join(source)
 
with open("key.txt", "rb") as f:
    for key in f:
        key = key.strip()
        if key in sourceSt:
        	print(key.decode('gbk'))
由于你的key是一行一个key这种特殊存在,可能这样写会更简洁,更快一点,大概可能50%的速度提升吧。 另外不建议查到就print,如果查到的key过多(比如key.txt中重复的很多),速度会很慢。 [/quote]大佬快给我感动哭了,快太多了简直 python可以在这种本身的代码上增加功能吗,比如说我要增加个找到了直接导出到一个TXT文本,或者直接在B文档中删除找到的词,
notback 2019-05-21
  • 打赏
  • 举报
回复
引用 38 楼 穿袜子的猫和穿靴子的狗 的回复:
太刺激了,这个弄完我也要好好学习python,非常非常感谢大佬耐心解答,

with open("source.txt", "rb")as f:
    source = f.readlines()
sourceSt = b"".join(source)
 
with open("key.txt", "rb") as f:
    for key in f:
        key = key.strip()
        if key in sourceSt:
        	print(key.decode('gbk'))
由于你的key是一行一个key这种特殊存在,可能这样写会更简洁,更快一点,大概可能50%的速度提升吧。 另外不建议查到就print,如果查到的key过多(比如key.txt中重复的很多),速度会很慢。
  • 打赏
  • 举报
回复
引用 36 楼 NotBack 的回复:
写错了

print(f"error key:{key.decode('gbk')}")
引用 35 楼 NotBack 的回复:

import re


with open("source.txt", "rb")as f:
	source = f.readlines()
sourceSt = b"".join(source)

with open("key.txt", "rb") as f:
	for key in f:
		key = key.strip()
		try:
			mObj = re.search(key, sourceSt,re.M|re.I)
		except Exception:
			print(f"error key:{key.decode("gbk")}")

		if mObj:
			print(key.decode("gbk"))
太刺激了,这个弄完我也要好好学习python,非常非常感谢大佬耐心解答,
  • 打赏
  • 举报
回复
引用 36 楼 NotBack 的回复:
写错了

print(f"error key:{key.decode('gbk')}")
哇过了半天key 好多字报错。。。贼尴尬哈哈哈 黑字都不认识
notback 2019-05-21
  • 打赏
  • 举报
回复
写错了

print(f"error key:{key.decode('gbk')}")
notback 2019-05-21
  • 打赏
  • 举报
回复

import re


with open("source.txt", "rb")as f:
	source = f.readlines()
sourceSt = b"".join(source)

with open("key.txt", "rb") as f:
	for key in f:
		key = key.strip()
		try:
			mObj = re.search(key, sourceSt,re.M|re.I)
		except Exception:
			print(f"error key:{key.decode("gbk")}")

		if mObj:
			print(key.decode("gbk"))
notback 2019-05-21
  • 打赏
  • 举报
回复

import re


with open("source.txt", "rb")as f:
	source = f.readlines()
sourceSt = b"".join(source)

with open("key.txt", "rb") as f:
	for key in f:
		key = key.strip()
		try:
			mObj = re.search(key, sourceSt,re.M|re.I)
		except Exception:
			print(f"error key:{key}")

		if mObj:
			print(key.decode("gbk"))
可能会对速度有影响,不过可以查key错误。
  • 打赏
  • 举报
回复
引用 29 楼 NotBack 的回复:
[quote=引用 27 楼 穿袜子的猫和穿靴子的狗 的回复:] 好的非常感谢大佬指点 我研究一下这个该怎么弄
如果#28的速度不理想,先开任务管理器看看,cpu占用多少。 如果运行的时候cpu占满了,估计你得考虑的是算法优化而不是开线程什么的。 如果cpu没占满,得考虑的是进程优化而不是线程优化。[/quote]cpu占用原来的代
引用 31 楼 NotBack 的回复:

import re


with open("source.txt", "rb")as f:
	source = f.readlines()
sourceSt = b"".join(source)

with open("key.txt", "rb") as f:
	for key in f:
		key = key.strip()
		mObj = re.search(key, sourceSt,re.M|re.I)
		if mObj:
			print(key.decode("gbk"))
错误不是由于中文问题,而是由于你的key中,包含re不允许的字符,比如需要转义的字符。 print的出来的由于是bytes,所以显示为内码形式,加个decode("gbk")就能显示出来。
哇这,有点麻烦,之前是因为内码什么的错误过滤过一次,很多那种看不到的字符,电话的图案啊什么的,这过滤不知道该怎么过滤了,不过感觉真的是快了很多,修改一下这个key多跑会看看 就显示出这十几个词的速度就觉得很快 大佬太厉害了!
加载更多回复(22)

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧