【求助】提高numpy执行效率的问题
这段代码是为了实现ANSYS后处理实现规范校核,需要从文本中读出各基础工况的应力结果,按照一定的规则组合,然后再取最不利的,也就是最大。但是我写完这段代码的时候发现执行效率不高,1000个单元的数据处理(代码中用的是随机生成的数据进行测试,未写读取数据的代码)需要一个小时,但是我的模型有20万个单元
可能是我的代码写的不够高,请教各位大神如何进行优化
程序代码:
import numpy as np import datetime log=open("Out.txt",mode='w',encoding='utf-8') t1=datetime.datetime.now() print("************* Printout: Start Time *********",file=log) print(t1,file=log) # 创建测试用的矩阵, 6个维度分别为σx,σy,σz,σxy,σyz,σxz =====> 实际代码中从文本中读取 n=150 # 单元数量204375 lc_n= 40 # 组合工况数量40 sxs=[np.random.random((n,6)) for i in range(13)] # 13个基础工况 # 创建2个零矩阵,用于存放最大值和最小值 所有工况 all_maxS=np.zeros((n,6)) all_minS=np.zeros((n,6)) # 创建1个零矩阵,用于存放等效应力 all_EqvS=np.zeros((n,1)) for lc_i in range(1,lc_n): #组合工况迭代 # 创建零矩阵,用于存放最大值和最小值 lc_maxS = np.zeros((n, 6)) lc_minS = np.zeros((n, 6)) # 创建1个零矩阵,用于存放等效应力 lc_EqvS = np.zeros((n, 1)) for i in range(1,180): #波峰相位角迭代 for j in range(1,180): #倾斜方位角迭代 LF = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] #工况组合系数,测试使用。 =====> 实际数据中从文本中读取, 最后几项需要根据波峰相位角、倾斜方位角计算得到 combined_S=np.zeros((n,6)) for k in range(1,13): # 基础工况迭代 combined_S = combined_S+LF[k]*sxs[k] # 组合好的应力分量 lc_maxS = np.maximum(lc_maxS, combined_S) #直接用矩阵计算得到同一工况下,不同波峰相位角、倾斜方位角的最大值 lc_minS = np.minimum(lc_minS, combined_S) #直接用矩阵计算得到同一工况下,不同波峰相位角、倾斜方位角的最小值 EqvS=(((combined_S[:,0]-combined_S[:,1])**2 + (combined_S[:,1]-combined_S[:,2])**2 + (combined_S[:,2]-combined_S[:,0])**2 + 6*(combined_S[:,3]**2 +combined_S[:,4]**2+combined_S[:,5]**2))/2)**0.5 lc_EqvS=np.maximum(lc_EqvS,EqvS) #直接用矩阵计算得到同一工况下,不同波峰相位角、倾斜方位角的最大等效应力 #********************** 增加将 lc_maxS、lc_minS 输出到文本的代码 ************************ all_maxS = np.maximum(lc_maxS, all_maxS) #直接用矩阵计算得到所有工况的最大值 all_minS = np.minimum(lc_minS, all_minS) #直接用矩阵计算得到所有工况的最小值 all_EqvS = np.maximum(lc_EqvS, all_EqvS) #直接用矩阵计算得到所有工况的最大等效应力 # ********************** 增加将 all_maxS、all_minS 输出到文本的代码 ************************ t2=datetime.datetime.now() print("************* Printout: End Time *********",file=log) print(t2,file=log) print("************* Time Consumed: seconds *********") print((t2-t1).seconds,file=log) log.close
[此贴子已经被作者于2022-6-20 08:26编辑过]