python下代码优化的一个例子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python下代码优化的一个例子相关的知识,希望对你有一定的参考价值。

   编程不是简单的堆砌代码,编写过程中也需要考虑执行效率,假如一段代码的计算复杂度较高,数据量一大就很难在有限时间内得到合理的结果,因此需要在编写代码的时候,尽量考虑计算的复杂度,减少无效的循环,多采用简单运算指令,减少逻辑判断,减少嵌套,在此基础上再考虑代码的可读性,以便于团队合作。

   最近碰上一个例子,有一个人提出了一个很小的需求:有两个数列,有可能一个长一个短,也可能一样长,需要将两个数列相加,并补上长数列多出来的元素,得到第三个数列,例如a = [1,2,3,4,5] b=[1,2,3],最后得到数列c=[2,4,6,4,5],需求很简单,然后一个新人给出了如下的代码(用PYTHON实现):

   

  a = [1,2,3,4,5]
  b = [9,8,7,6,5]
 
   def judge1(a,b):                
     c = []
     if len(a) > len(b):
        for i in range(len(b)):
            c.append(a[i]+b[i])
        for j in range(len(a) - len(b)):
            c.append(a[len(b)+j])
   
     if len(b) > len(a):
        for i in range(len(a)):
            c.append(a[i]+b[i])
        for j in range(len(b) - len(a)):
            c.append(b[len(a)+j])
   
     if len(a) == len(b):
        for i in range(len(b)):
            c.append(a[i]+b[i])

   

 

       看以上代码,一堆的循环和判断,并有许多重复代码,可读性极差,这是初学者常犯的错误。然后第二个人提出了如下优化方案(Python实现):

 
  def judge2(a,b):
    i=0
    for data in a:
        if(i>=len(b)):
           b.append(data)
        else:
            b[i]+=data;
        i+=1
   
    return b


 

       从代码上可以看出已经得到了很大的优化,原来十多行的代码,现在只要67行就能搞定了,代码可读性很高,很容易理解,但这只里仍然存在一个问题:如果ab短,则运行效率较高,但是如果ab长呢,则性能会大大下降,因为循环的次数会大大增加,输入不同的数据,执行性能就会巨大的差别,同时中间变量也发生了变化。

       因此又有了第三个方案:第一步,短的向量,自动补齐0元素,并保证两个向量的长度一致,第二步,两个向量直接相加,这样就可以大大提高代码的运行效率,如下(Python实现):

 

def judge3(a, b):
    if len(a)< len(b):
        l = len(b)-len(a)
        t = a + [0 for x in range(0, l)]
        k = b
    else:
        l = len(b)-len(a)
        t = b + [0 for x in range(0, l)]
        k = a
    result = [t[i] + k[i] for i in range(0,len(t))]
    return result

 

 

如上代码,代码很容易理解,首先判断两个向量的长度,短的自动补齐0元素,然后两个向量进行对位相加,最后就能得到结果,代码很容易理解,非常pythonic,性能也很高,不会因为ab长度的变化有明显的性能偏差,第一种方法就不说了,第二种方法和第三种方法的性能比较如下:

   

              
if __name__ ==‘__main__‘:
    a = [2000 for x in range(0, 10000)]             #设计两个长度差别非常大的向量  
    b = [100 for x in range(0, 100)]
   
    time1= time.time()
    for i in range(1000):
        judge2(a,b)
        judge3(b,a)
       
    time2= time.time()
    print u"方法2总用时:%d" % (time2-time1)     
  
    time1= time.time()
    for i in range(1000):
        judge2(a,b)
        judge3(b,a)
       
    time2= time.time()
    print u"方法3总用时:%d" % (time2-time1)

 

最后得出如下测试结果:

方法2总用时:6
方法3总用时:1


 

假如变换ab,方法3的性能没有明显的偏差。

 

当然,上面这个只是最近碰到的一个例子,平时工作中还会碰到许多类似的情况,在编写代码的时候都需要仔细考虑,不要操之过急,编程不是简单的堆砌代码,这方面也可以通过阅读《编程珠玑》《代码整洁之道》等书籍得到进一步的提高。


以上是关于python下代码优化的一个例子的主要内容,如果未能解决你的问题,请参考以下文章

优化 C# 代码片段、ObservableCollection 和 AddRange

分享几个实用的代码片段(附代码例子)

分享几个实用的代码片段(附代码例子)

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

golang goroutine例子[golang并发代码片段]

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化