Tout d'abord désolé pour le long morceau de code collé ci-dessous. C'est la première fois que je m'inquiète de la performance d'une application, donc je n'ai jamais vraiment eu peur de la performance. Ce morceau de code cherche à peu près une image dans une autre image, il faut 30 secondes pour exécuter sur mon ordinateur, convertissant les images en niveaux de gris et autres changements rasés de 15 secondes, j'ai besoin de 15 autres rasés. J'ai lu un tas de pages et regardé des exemples mais je n'ai pas pu trouver les mêmes problèmes dans mon code. Donc toute aide serait grandement appréciée. De son apparence (cProfile), 25 secondes sont passées dans le module Image et seulement 5 secondes dans mon code.Optimisation du code en utilisant PIL
from PIL import Image
import os, ImageGrab, pdb, time, win32api, win32con
import cProfile
def GetImage(name):
name = name + '.bmp'
try:
print(os.path.join(os.getcwd(),"Images",name))
image = Image.open(os.path.join(os.getcwd(),"Images",name))
except:
print('error opening image;', name)
return image
def Find(name):
image = GetImage(name)
imagebbox = image.getbbox()
screen = ImageGrab.grab()
#screen = Image.open(os.path.join(os.getcwd(),"Images","Untitled.bmp"))
YLimit = screen.getbbox()[3] - imagebbox[3]
XLimit = screen.getbbox()[2] - imagebbox[2]
image = image.convert("L")
Screen = screen.convert("L")
Screen.load()
image.load()
#print(XLimit, YLimit)
Found = False
image = image.getdata()
for y in range(0,YLimit):
for x in range(0,XLimit):
BoxCoordinates = x, y, x+imagebbox[2], y+imagebbox[3]
ScreenGrab = screen.crop(BoxCoordinates)
ScreenGrab = ScreenGrab.getdata()
if image == ScreenGrab:
Found = True
#print("woop")
return x,y
if Found == False:
return "Not Found"
cProfile.run('print(Find("Login"))')