为什么aiofiles 比普通文件操作还要慢?
多个日志文件中查找是否含有某个字符串,发现aiofiles很慢,不知道是否使用方法有误?恳请指点
files = [
r'C:\log\20210523.log',
r'C:\log\20210522.log',
r'C:\log\20210521.log',
r'C:\log\20210524.log',
r'C:\log\20210525.log',
r'C:\log\20210520.log',
r'C:\log\20210519.log',
]
async def match_content_in_file(filename:str,content:str,encoding:str="gbk")->bool:
async with aiofiles.open(filename,mode="r",encoding=encoding) as f:
# text = await f.read()
# return content in text
async for line in f:
if content in line:
return True
def match_content_in_file2(filename:str,content:str,encoding:str="gbk")->bool:
with open(filename,mode="r",encoding=encoding) as f:
# text = f.read()
# return content in text
for line in f:
if content in line:
return True
async def main3():
start = time.time()
tasks = [match_content_in_file(f,'808395') for f in files]
l = await asyncio.gather(*tasks)
print(l)
end = time.time()
print(end - start)
def main2():
start = time.time()
l = []
for f in files:
l.append(match_content_in_file2(f,'808395'))
print(l)
end = time.time()
print(end-start)
if __name__ == '__main__':
asyncio.run(main3()) # 很慢
main2() # 很快
实测情况(每个文件约7.5M)
- 逐行读取文件内容异步方式耗时巨大。
[True, True, True, None, None, True, True]
异步方式: 40.80606389045715
-------------------------------------
[True, True, True, None, None, True, True]
同步方式: 0.48870062828063965
- 一次性读取文件内容,异步方式和同步方式差别不大,但还是同步快一点
[True, True, True, False, False, True, True]
异步方式: 0.6835882663726807
-------------------------------------
[True, True, True, False, False, True, True]
同步方式: 0.6745946407318115
环境
python 3.9.2 win10
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
aio是io复用,只能解决io性能问题,可以看下cpu,如果单核cpu已经打满了的话,用协程也不会提升性能的
为什么我测试正好相反呢, 环境 3.8.2
outputs
这个测试很有趣,我也测了一下
当文件存在时,aiofiles慢了很多很多
结果:
硬盘读取一个文件是最快的, 同时多读几个文件, 要在多个磁盘块中反复切换, 反而慢.
读文件和网络通讯不一样, 网络请求是在发送后, 需要等待, 这个时候可以使用协程提升并发数量.
硬盘不行.