numpy吧 关注:62贴子:78
  • 1回复贴,共1

【求助】numpy做大型矩阵计算的效率提升

只看楼主收藏回复

各位大牛,我需要弄一个程序,实现ANSYS后处理实现规范校核,需要从文本中读出各基础工况的应力结果,按照一定的规则组合,然后再取最不利的,也就是最大。
但是我写完这段代码的时候发现执行效率不高,1000个单元的数据处理(代码中用的是随机生成的数据进行测试,未写读取数据的代码)需要一个小时,但是我的模型有20万个单元
可能是我的代码写的不够高,请教各位大神如何进行优化。
代码部分未完整(使用示例数据,并未按照实际去取值),说明如下:

代码如下
import numpy as np
import time
import math
n = 100 # 单元数量204375
start = time.time()
import numba as nb
@nb.jit(nopython=True,fastmath=True) # 使用 jit 装饰器表明我们希望将该函数转换为机器代码,并且启用多核计算
# @nb.njit(parallel=True, fastmath=True)
def Checkit(n):
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))
combined_S = np.zeros((n, 6))
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] # 工况组合系数,测试使用。 =====> 实际数据中从文本中读取, 最后几项需要根据波峰相位角、倾斜方位角计算得到
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) # 直接用矩阵计算得到所有工况的最大等效应力
Checkit(n)
end = time.time()
run_time = end-start
print('Average time={}'.format(run_time))


IP属地:广东1楼2022-06-21 16:08回复
    numpy生成随机数是串行的,建议计时时不要包括随机数生成


    IP属地:黑龙江来自Android客户端2楼2024-08-09 16:39
    回复