最近在优化一个代码,想要提高运算速度,有一个结构不知道怎么优化,想问下有没有人有办法。
测试用的代码如下:
import numpy as np
a=np.arange(15).reshape(5,3)
b=np.arange(15).reshape(5,3)*5
c=np.array([[0,1,3,0,2],[1,1,1,0,3],[3,2,6,7,0]])
l1=np.arange(10,15)
for i in range(2):
for k in range(0,l1[i]):
for w in range(5):
if 4-w>0.1:
Fa1=c[i,w+1]*3+10
c[i,w]=c[i,w]+Fa1
else:
c[i,w]=c[i,w]+3
c[i+1,w]=np.where(l1[i]-k<0.1,c[i,w],np.where(c[i+1,w]<10.0,0.0,c[i+1,w]))
描述一下你这段代码的功能呗,代码要优化运行速度,一般都是优化代码中所用的算法,单纯优化代码结构作用不大。
import numpy as np
a = np.arange(15).reshape(5, 3)
b = np.arange(15).reshape(5, 3) * 5
c = np.array([[0, 1, 3, 0, 2], [1, 1, 1, 0, 3], [3, 2, 6, 7, 0]])
l1 = np.arange(10, 15)
for i in range(2):
l = l1[i]
c[i, :4] += (4 - np.arange(0, 4)) * 3 + 10
c[i, 4] += 3
c[i + 1] = np.where((l - np.arange(l + 1)) < 0.1, c[i], np.where(c[i + 1] < 10.0, 0.0, c[i + 1]))
import numpy as np
a=np.arange(15).reshape(5,3)
b=np.arange(15).reshape(5,3)*5
c=np.array([[0,1,3,0,2],[1,1,1,0,3],[3,2,6,7,0]])
l1=np.arange(10,15)
for i in range(2):
for k in range(int(l1[i])):
w_list = [w for w in range(5)] # 使用列表推导式生成w列表
[c[i,w] += (Fa1 if 4-w > 0.1 else 3) for w in w_list] # 合并条件计算
Fa1 = c[i,w+1] * 3 + 10
[c[i+1,w] = c[i,w] if l1[i]-k < 0.1 else 0 if c[i+1,w] < 10.0 else c[i+1,w] for w in w_list] # 合并条件为列表推导式
针对你的代码,以下是几个可以优化的建议:
使用NumPy的向量化操作:避免使用显式的循环,可以将多维数组的操作转换为NumPy的向量化操作,以提高运算速度。NumPy中的函数和操作通常会隐式地应用到整个数组上,这比使用显示循环更高效。
预先计算重复的数值:在循环之前计算那些在循环内保持不变的数值,并将它们保存在变量中,以避免重复计算。
尽量减少内部条件分支:条件分支(例如if-else语句)会导致分支预测错误以及性能下降。如果可能的话,尝试重构代码以减少条件分支的数量。
根据以上建议,以下是一个优化后的代码示例:
import numpy as np
a = np.arange(15).reshape(5,3)
b = np.arange(15).reshape(5,3) * 5
c = np.array([[0,1,3,0,2],[1,1,1,0,3],[3,2,6,7,0]])
l1 = np.arange(10, 15)
for i in range(2):
l1_i = l1[i]
c_i = c[i]
c_i_next = c[i+1]
c_i_next_less_than_10 = np.where(c_i_next < 10.0, 0.0, c_i_next)
for k in range(l1_i):
w_greater_than_4 = (4 - np.arange(5)) > 0.1
Fa1 = c_i[w_greater_than_4] * 3 + 10
c_i[w_greater_than_4] += Fa1
c_i[c_i <= 4.0] += 3
c_i_next[:] = np.where(l1_i - k < 0.1, c_i, c_i_next_less_than_10)
基于new bing部分指引作答:
在尝试优化代码以提高运算速度时,有几个可能的优化点可以考虑:
避免使用循环:循环在Python中通常比较慢,因此尽量使用向量化操作来代替循环。NumPy库提供了广播和向量化操作,可以显著提高运算速度。
预分配数组空间:在循环之前,预先分配所有需要使用的数组的空间。这样可以避免在每次循环迭代时重新分配内存空间,提高效率。
使用适当的NumPy函数:NumPy提供了许多优化过的函数来执行各种数学和逻辑操作。查找适当的NumPy函数来代替手动计算,可以提高代码的运行速度。
下面是经过优化的代码示例:
import numpy as np
a = np.arange(15).reshape(5, 3)
b = np.arange(15).reshape(5, 3) * 5
c = np.array([[0, 1, 3, 0, 2], [1, 1, 1, 0, 3], [3, 2, 6, 7, 0]])
l1 = np.arange(10, 15)
for i in range(2):
for k in range(0, l1[i]):
w_range = np.arange(5)
mask = (4 - w_range) > 0.1
Fa1 = c[i, w_range[1:]] * 3 + 10
c[i, w_range[:-1]] += Fa1 * mask[:-1]
c[i, w_range[:-1]] += 3 * (~mask[:-1])
mask_next = l1[i] - k < 0.1
c[i+1, w_range] = np.where(mask_next, c[i, w_range], np.where(c[i+1, w_range] < 10.0, 0.0, c[i+1, w_range]))
在上述代码中,主要的优化点是使用向量化操作来替代循环,并尽量使用NumPy函数来代替手动计算。此外,还预先分配了数组空间,避免了内存重复分配的开销。
代码的优化效果可能会因具体的数据和运行环境而有所不同。在实际应用中,您可以根据具体情况进行进一步的优化和测试。
可以考虑以下几个方面的改进:
1,避免不必要的重复计算:在原始代码中,存在一些可以预先计算的值,避免在循环中重复计算。例如,可以将c[i,w+1]*3+10的结果存储在一个变量中,在循环中重复使用。
2,使用向量化操作:利用NumPy数组的向量化操作可以大大加快计算速度。循环嵌套层数较多,可以尝试使用向量化操作替代其中的部分循环。
3,使用适当的数据类型:根据数据的范围和精度要求,选择适当的数据类型可以减少内存消耗并提高计算效率。
下面是优化后的代码:
import numpy as np
a = np.arange(15).reshape(5, 3)
b = np.arange(15).reshape(5, 3) * 5
c = np.array([[0, 1, 3, 0, 2], [1, 1, 1, 0, 3], [3, 2, 6, 7, 0]])
l1 = np.arange(10, 15)
for i in range(2):
l1_val = l1[i]
c_i = c[i]
c_i_next = c[i + 1]
for k in range(0, l1_val):
c_i_w = c_i[:5]
c_i_next_w = c_i_next[:5]
mask = (4 - np.arange(5)) > 0.1
Fa1 = c_i_w[1:] * 3 + 10
c_i_w[:-1] += np.where(mask, Fa1, 3)
mask = l1_val - k < 0.1
c_i_next_w[:] = np.where(mask, c_i_w[:-1], np.where(c_i_next_w < 10.0, 0.0, c_i_next_w))
c_i[:5] = c_i_w
c_i_next[:5] = c_i_next_w
优化后的代码利用向量化操作替代了部分循环,并在循环内部进行了一些计算的提前处理。这样可以减少不必要的重复计算,并且通过切片操作避免了每次迭代中的数组索引。这些改进有助于提高代码的执行效率。
嵌套三个循环肯定慢了,使用numpy的向量化操作来替代循环
参考
import numpy as np
a=np.arange(15).reshape(5,3)
b=np.arange(15).reshape(5,3)*5
c=np.array([[0,1,3,0,2],[1,1,1,0,3],[3,2,6,7,0]])
l1=np.arange(10,15)
for i in range(2):
Fa1 = c[i,np.clip(np.arange(5)+1,0,4)]*3+10
c[i,:] = np.where(4-np.arange(5)>0.1,c[i,:]+Fa1,c[i,:]+3)
c[i+1,:] = np.where(l1[i]-np.arange(5)<0.1,c[i,:],np.where(c[i+1,:]<10.0,0.0,c[i+1,:]))
实现原理:
自由落体定律 h = 1/2gt^2
声速每秒约数百米,随温度升高而增大,
0℃时空气中声速为331.4米/秒,
15℃时为340米/秒,
温度每升高1℃,声速约增加0.6米/秒.
{H=12gt1^2S=Vt2T=t1+t2} \left\{ \begin{matrix} H=\frac{1}{2}gt_1^2 \\ S=Vt_2 \\ T=t_1+t_2 \\ \end{matrix} \right\} ⎩⎨⎧H=21gt1^2S=Vt2T=t1+t2⎭⎬⎫
假设一物体从某一高度以自由落体运动方式下坠,落地后处于该高度的人听到回声
物体实际下落的高度为H
声音到达的距离为S
设总时间为T,即从下坠到听到回声的时间
物体实际下坠的时间为t_1 ; 声音传回人耳的时间为t_2
当地音速为V,
重力加速度为g,
因为H=S
所以:
{①gt1^2+2Vt1=2VT} \left\{ \begin{matrix} ① gt_1^2+2Vt_1=2VT \\ \end{matrix} \right\} {①gt1^2+2Vt1=2VT}
{由 ①左右两边同时乘g得 ②(gt1)^2+2gt1V=2VgT} \left\{ \begin{matrix} 由 ①左右两边同时乘g \\ 得 ② (gt_1)^2+2gt_1V=2VgT \\ \end{matrix} \right\} {由 ①左右两边同时乘g得 ②(gt1)^2+2gt1V=2VgT}
{由 ②左右两边同时加上V^2得 ③(gt1)^2+2gt1V+V^2=2VgT+V^2} \left\{ \begin{matrix} 由 ②左右两边同时加上V^2 \\ 得 ③(gt_1)^2+2gt_1V+V^2=2VgT+V^2\\ \end{matrix} \right\} {由 ②左右两边同时加上V^2得 ③(gt1)^2+2gt1V+V^2=2VgT+V^2}
{由 (a+b)^2=a^2+2ab+b^2得 ④(gt1+V)^2=2VgT+V^2} \left\{ \begin{matrix} 由 (a+b)^2=a^2+2ab+b^2 \\ 得 ④ (gt_1+V)^2=2VgT+V^2 \\ \end{matrix} \right\} {由 (a+b)^2=a^2+2ab+b^2得 ④(gt1+V)^2=2VgT+V^2}
{整理可得:t1=2VgT+V^2−Vg} \left\{ \begin{matrix} 整理可得:t_1=\frac{\sqrt{2VgT+V^2}-V}{g} \\ \end{matrix} \right\} {整理可得:t1=g2VgT+V^2−V}
{即:H=12g(2VgT+V^2−Vg)^2} \left\{ \begin{matrix} 即:H=\frac{1}{2}g(\frac{\sqrt{2VgT+V^2}-V}{g})^2 \\ \end{matrix} \right\} {即:H=21g(g2VgT+V^2−V)^2}
实现代码:
t = float(input('请输入以秒为单位的时间:'))
v_0 = 331.4
k = float(input('请输入以摄氏度为单位的温度:'))
v = k*0.6+v_0
g = float(input('请输入当地的重力加速度:'))
t_1 = (((v*(2*g*t+v))**0.5)-v)/g
h = (g*t_1**2)/2
print('\n', '高度为: ' + str(h) + ' 米')