Murinedj 发表于 2021-7-5 17:57

关于python循环遍历优化 求助

需求:日志遍历,对应服务器日志中每个客户请求和应答时间统计


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

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

以下是部分的代码

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

      print(arr_os)

      for j in range(len(data_str)):
            if arr_os in data_str and '' in data_str:
                timedata3 = data_str
                recv_time = timedata3# recv时间戳
                recv_time_str = recv_time + ':' + recv_time + ':' + recv_time + '.' + recv_time
                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

醉红尘0 发表于 2021-7-5 18:02
考虑将日志切片,然后多线程跑吧

切片 多线程 王道 没有之一

lostlq 发表于 2021-7-5 19:56

上面切片多线程都说了,云玩家就你现在代码提三点吧
1、去掉print
2、arr_os data_str 这两个在内循环外直接定义变量赋值,不要做多次数组取值操作
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
页: [1] 2
查看完整版本: 关于python循环遍历优化 求助