如何提高python代码的速度?

如何提高python代码的速度?,python,performance,for-loop,Python,Performance,For Loop,这是一个导入多幅图像并使用dct和直方图提取特征的程序。 1) 从文件夹中导入多个图像 2) 使图像大小为256*256 3) 使用步幅为32的64*64块单元的图像 4) Do dct(8*8尺寸) 5) 制作dct直方图 6) 从dct系数直方图中提取特征 问题是它太慢了。 我想这是因为有太多的“for-loop” 这是我用python编写的完整代码。 如何更改代码以提高速度 我不熟悉python。 请帮帮我 import numpy as np from scipy.fftpack imp

这是一个导入多幅图像并使用dct和直方图提取特征的程序。 1) 从文件夹中导入多个图像

2) 使图像大小为256*256

3) 使用步幅为32的64*64块单元的图像

4) Do dct(8*8尺寸)

5) 制作dct直方图

6) 从dct系数直方图中提取特征

问题是它太慢了。 我想这是因为有太多的“for-loop”

这是我用python编写的完整代码。 如何更改代码以提高速度

我不熟悉python。 请帮帮我

import numpy as np
from scipy.fftpack import dct
from PIL import Image
import glob
import matplotlib.pyplot as plt

def find_index(x,key):
    for i in range(0,len(x)):
        if x[i] == key :
            return i
        else:
            i = i+1

def image_open(path):
    image_list = []
    #for filename in glob.glob('path/*.jpg'): 
    for filename in glob.glob(path+'/*.jpg'):  
     im=Image.open(filename)
     image_list.append(im)

    return image_list

def dct_2(img):  
    #Get 2D Cosine Transform of Image
    return dct(dct(np.asarray(img).T, norm='ortho').T, norm='ortho')


def return_array(array):
    zero = [0.0, 0.0, 0.0, 0.0, 0.0]

    range = int((max(array)) - min(array))
    x, bins, patch = plt.hist(array, bins=range)
    x = list(zero) + list(x) + list(zero)
    return x


path = 'C:\\Users\\LG\\PycharmProjects\\photo' #folder that contains many images

images = image_open(path)


row = 0
array_matrix = []
label_matrix = []

for i in range(0, len(images)): #access image    
 box3 = (0,0,256,256)
 a = images[i].crop(box3)

 (y,cb,cr) = a.split()  #ycbcr 
 width , height = y.size  
 y.show()

 for q in range(0, height-32 , 32):  #use image 64*64 block unit
  for w in range(0 , width-32 ,32):
     box1 =(q,w,q+64,w+64)
     block = y.crop(box1)
     array1 , array2 , array3 , array4 , array5 , array6 , array7 , array8 ,array9 = [],[],[],[],[],[],[],[],[]



     for j in range(0,64,8):        #dct
       for n in range(0,64,8):
         box2 = (j,n,j+8,n+8)
         temp = block.crop(box2)
         dct_temp = dct_2(temp)


         array1.append(dct_temp[0,1])
         array2.append(dct_temp[1,0])
         array3.append(dct_temp[0,2])
         array4.append(dct_temp[1,1])
         array5.append(dct_temp[2,0])
         array6.append(dct_temp[0,3])
         array7.append(dct_temp[1,2])
         array8.append(dct_temp[2,1])
         array9.append(dct_temp[3,0])


     x1 = return_array(array1)   #extract feature from dct histogram
     index = find_index(x1, max(x1))
     u = [index - 5, index + 5, 1]
     array_matrix.append(x1[u[0]:u[1] + 1:u[2]])

     x2 = return_array(array2)
     index = find_index(x2, max(x2))
     u = [index - 5, index + 5, 1]
     array_matrix[row].extend(x2[u[0]:u[1] + 1:u[2]])

     x3 = return_array(array3)
     index = find_index(x3, max(x3))
     u = [index - 5, index + 5, 1]
     array_matrix[row].extend(x3[u[0]:u[1] + 1:u[2]])

     x4 = return_array(array4)
     index = find_index(x4, max(x4))
     u = [index - 5, index + 5, 1]
     array_matrix[row].extend(x4[u[0]:u[1] + 1:u[2]])

     x5 = return_array(array5)
     index = find_index(x5, max(x5))
     u = [index - 5, index + 5, 1]
     array_matrix[row].extend(x5[u[0]:u[1] + 1:u[2]])

     x6 = return_array(array6)
     index = find_index(x6, max(x6))
     u = [index - 5, index + 5, 1]
     array_matrix[row].extend(x6[u[0]:u[1] + 1:u[2]])

     x7 = return_array(array7)
     index = find_index(x7, max(x7))
     u = [index - 5, index + 5, 1]
     array_matrix[row].extend(x7[u[0]:u[1] + 1:u[2]])

     x8 = return_array(array8)
     index = find_index(x8, max(x8))
     u = [index - 5, index + 5, 1]
     array_matrix[row].extend(x8[u[0]:u[1] + 1:u[2]])

     x9 = return_array(array9)
     index = find_index(x9, max(x9))
     u = [index - 5, index + 5, 1]
     array_matrix[row].extend(x9[u[0]:u[1] + 1:u[2]])

     print(w/32)

     row = row+1

print(array_matrix)

我建议您分析脚本,而不是假设某个特定部分比其他部分花费的时间更长。探查器将收集程序特定部分所用时间的度量,还允许您更好地查看任何更改对代码的影响程度(使代码更好、更差等)

一旦你知道了你的问题所在,你就可以采取更有针对性的方法来加快解决

查看分析模块:

还可以查看一些教程:


您是否尝试过评测代码,看看慢的部分是什么?我不知道如何评测,但我想这是因为循环太多,可能是数组太大了。