Более эффективный метод разрыва для вложенных циклов? - PullRequest
0 голосов
/ 22 февраля 2019

Хорошо, у меня есть этот скрипт, он щелкает только по пикселям, имеющим определенный оттенок серого, он работает в большинстве случаев отлично, кроме одной вещи, он слишком длинный и занимает около секунды, чтобы пройти каждый раз, какДолжен ли я изменить свой перерыв, чтобы он работал лучше и не допустить повторения цикла после того, как я нашел один действительный пиксель?

xx = 0
while xx <= 600:
    with mss.mss() as sct:
        region = {'top': 0, 'left': 0, 'width': 1920, 'height': 1080}
        imgg = sct.grab(region)
        pxls = imgg.pixels

        for row, pxl in enumerate(pxls):
            for col, pxll in enumerate(pxl):
                if pxll == (102, 102, 102):
                    if col>=71 and col<=328 and row<=530 and row>=378:
                        foundpxl = pxll
                        print(str(col) +" , "+ str(row))
                        pyautogui.click(col,row)
                        break
        xx = xx + 1
        time.sleep(.05)

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Отказ от ответственности: я не знаком с MSS.Несколько вещей, которые вы можете улучшить:

  1. Нет необходимости перечислять значения, которые вас не интересуют. Вы можете сделать:
for row, pxl in enumerate(pxls, start=378):
    if row > 530:
       break
    for col, pxll in enumerate(pxl, start=71):
        if col > 328:
           break
Разве вы не можете просто сделать скриншот нужного региона?Как то так должно работать?
region = {'top': 378, 'left': 71, 'width': 328-71, 'height': 530-378}
Вы манипулируете двумерными массивами с помощью двойных петоновых петель.Вы можете использовать некоторый модуль, предназначенный для выполнения операций над массивами, и он может быть на несколько порядков быстрее.Что-то вроде Pandas или NumPy должно запускать это практически мгновенно.
0 голосов
/ 22 февраля 2019

Вы можете использовать конструкцию for-else для continue, если действительный пиксель не найден (и, следовательно, break не найден) во внутреннем цикле, или break внешний цикл, если он найден:

for row, pxl in enumerate(pxls):
    for col, pxll in enumerate(pxl):
        if pxll == (102, 102, 102) and col >= 71 and col <= 328 and row <= 530 and row >= 378:
            foundpxl = pxll
            print(str(col) + " , " + str(row))
            pyautogui.click(col, row)
            break
    else:
        continue
    break
...