python for循环计算速度很慢

从一个比较大的数据文件中读取数据,是一个80k乘10k的矩阵,保存在pickle文件中,循环读取然后做一些计算处理,最后记录并保存为同样矩阵大小的文档,代码写好之后,开始测试,跑一个循环就要6s左右,一共80k个循环,就是133.3333334小时,要命,耗不起。
先上代码,再细究这个问题还有解决办法:

	...
	with open(save_path, 'rb') as fi1:
	    result = pickle.load(fi1, encoding='iso-8859-1')
	n, fx = zip(*result)

	merge_result=[]
    #starttime = datetime.now()
    for i in range(0, len(result)):
        #starttime = datetime.now()
        f_x = np.array(fx)[i]  #problem is here
        name = result[i][0]
        full_result= merge_result(f_x)
        merge_result.append((name, full_result))
        if i % 1000 == 0:
            print('processing result:{}/80000\r'.format(i))
        #endtime = datetime.now()
        #print('consuming time:', (endtime - starttime))
        #starttime = datetime.now()
        
	...

按照上面这段代码,跑一个循环耗时是5.92s左右,用的显卡是Titan xp,太费时间了,速度这么慢,非常不合理,对各个部分的耗时都做了计算,最后发现问题出在f_x = np.array(fx)[i]这里,因为fx是一个元组,当时的理解是需要转换成array数组的形式进行计算,后来了解了一下,在Python中其实是没有数组这个概念的,只有列表(list)和元组(tuple),还是基础的问题,对python理解不够。
问题找到了,解决起来也有方向了,后来发现其实根本不需要转化成numpy的数组形式进行计算,因为通过序号检索得到的结果就是数组的形式,不需要再对整个矩阵进行转化成array操作。
代码修改后如下:

	...
	with open(save_path, 'rb') as fi1:
	    result = pickle.load(fi1, encoding='iso-8859-1')
	n, fx = zip(*result)

	merge_result=[]
    #starttime = datetime.now()
    for i in range(0, len(result)):
        #starttime = datetime.now()
        f_x = fx[i]  #problem is here
        name = result[i][0]
        full_result= merge_result(f_x)
        merge_result.append((name, full_result))
        if i % 1000 == 0:
            print('processing result:{}/80000\r'.format(i))
        #endtime = datetime.now()
        #print('consuming time:', (endtime - starttime))
        #starttime = datetime.now()
        
	...

修改完之后,再测试速度,跑一个循环只需要0.127s左右,这就舒服多了,效率也高了很多。
速度大幅提升啊!

关键还是对基础的知识了解得不够,多学习多积累,共勉。

你可能感兴趣的:(Python,python,for循环)