吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1723|回复: 13
收起左侧

[求助] 关于python循环遍历优化 求助

  [复制链接]
Murinedj 发表于 2021-7-5 17:57
需求:日志遍历,对应服务器日志中每个客户请求和应答时间统计


首先把遍历关键词放入一个array的二维数组中

第一个循环把array中第i个取出,然后用这个去遍历日志中,任何含有该关键词的都取出来,存进一个list中

以下是部分的代码

for i in range(np.size(arr_os,0)):
    recv_date = None
    recv_time_str = None

    print(arr_os[i][0])

    for j in range(len(data_str)):
        if arr_os[i][0] in data_str[j] and '[recv]' in data_str[j]:
            timedata3 = data_str[j]
            recv_time = timedata3[10:22]  # recv时间戳
            recv_time_str = recv_time[0:2] + ':' + recv_time[2:4] + ':' + recv_time[4:6] + '.' + recv_time[6:9]
            recv_date = timecalcu.trans_date_ms(recv_time_str)
            continue


我需要遍历800万条的日志,内嵌的for循环中加了if。。。break等必要的判断去尽量减少遍历次数,但是耗时还是要很久,要24小时。请问各位大神有什么优化这种遍历的方法??

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Murinedj 发表于 2021-7-5 18:00
网上看的双循环优化方法都是针对类似于array,numba等计算类型的优化,我这个就单纯要遍历,然后取出字符串进行统计的。真的想不出办法,头秃了。求救啊
醉红尘0 发表于 2021-7-5 18:02
夏蓝 发表于 2021-7-5 18:53
lostlq 发表于 2021-7-5 19:56
上面切片多线程都说了,云玩家就你现在代码提三点吧
1、去掉print
2、arr_os[i][0] data_str[j] 这两个在内循环外直接定义变量赋值,不要做多次数组取值操作
3、不知道命中的日志是否很多,取时间、转换的方法有点low,效率不高。
Lopht 发表于 2021-7-5 20:10
如楼上,去掉print后,效果立竿见影。python的print效率最为诟病。

我没学过几天python,而且也不清楚你的文件数据结构,瞎说几句,你参考。

1. 如果有文本形大文件需要查找,我会优先考虑使用正则,因为效率真心最高。

2. 使用Python自带的filter函数,遍历的效率提高一大截。

3.尽量不要重复做同样的事,使用正则分组,遍历一次得到N个结果,减少遍历次数。或者我会遍历一次取出需要的数据集,再在得出的数据集中细分类,这比每次都在原始数据中遍历效率要高很多。

不太懂编程,供你参考。
fanvalen 发表于 2021-7-5 20:34
for效率是很慢的,通常大数据都不用,洗数据用pandas
reborn0866 发表于 2021-7-5 20:41
学到了,原来python的print那么耗费资源啊…
潇洒超人 发表于 2021-7-5 20:49
总结一下:
1、避免使用print
2、避免重复存取数组
3、分割数据、多线程遍历
阳光肥肥 发表于 2021-7-5 21:24
算是经典问题,python处理大文件?

如果英文不错可以看看下面这个讨论
https://stackoverflow.com/questions/30294146/fastest-way-to-process-a-large-file
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 00:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表