Python 代码结构优化提高运算速度

最近在优化一个代码,想要提高运算速度,有一个结构不知道怎么优化,想问下有没有人有办法。
测试用的代码如下:

  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] # 合并条件为列表推导式

针对你的代码,以下是几个可以优化的建议:

  1. 使用NumPy的向量化操作:避免使用显式的循环,可以将多维数组的操作转换为NumPy的向量化操作,以提高运算速度。NumPy中的函数和操作通常会隐式地应用到整个数组上,这比使用显示循环更高效。

  2. 预先计算重复的数值:在循环之前计算那些在循环内保持不变的数值,并将它们保存在变量中,以避免重复计算。

  3. 尽量减少内部条件分支:条件分支(例如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,:]))

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7568874
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:python可视化(案例)高颜值图的复现(学术论文、商业周刊)
  • 除此之外, 这篇博客: python计算高度中的 此程序可以根据物体下坠时间,自动计算下坠高度 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 实现原理:

    自由落体定律 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=21gt12S=Vt2T=t1t2

    假设一物体从某一高度以自由落体运动方式下坠,落地后处于该高度的人听到回声
    物体实际下落的高度为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\} {gt12+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\} { V2 (gt1)2+2gt1V+V2=2VgT+V2}

    {由 (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=a2+2ab+b2 (gt1+V)2=2VgT+V2}

    {整理可得:t1=2VgT+V^2−Vg} \left\{ \begin{matrix} 整理可得:t_1=\frac{\sqrt{2VgT+V^2}-V}{g} \\ \end{matrix} \right\} {t1=g2VgT+V2V}

    {即: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=21gg2VgT+V2V2}


    实现代码:

    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) + '  米')
    
    
  • 您还可以看一下 杨千锋老师的Python爬虫从入门到高级实战精品课课程中的 爬虫概念-课程内容-2小节, 巩固相关知识点