Как мне ускорить получение 4 пикселей

#python #python-3.x #pycharm

#python #python-3.x #pycharm

Вопрос:

У меня есть некоторый код, который определяет цвета пикселей в диапазоне и нажимает для них клавишу

 from PIL import ImageGrab
import pyautogui
import pydirectinput
import keyboard
import time

LeftPressed = False
MiddleLeftPressed = False
MiddleRightPressed = False
RightPressed = False

 region Info
 LeftPos = x 783, y 724 -> rgb = 255, 229, 15
 MiddleLeftPos = x 902, y 724 -> rgb = 255, 229, 15
 MiddleRightPos = x 1016, y 724 -> rgb = 255, 229, 15
 RightPos = x 1132, y 724 -> rgb = 255, 229, 15 endregion


while True:
    ss = ImageGrab.grab()
    r = ss.getpixel(xy=(783, 724))[0]
    if 225 < r <= 255:
        pydirectinput.keyDown('q')
        LeftPressed = True
    elif LeftPressed:
        pydirectinput.keyUp('q')
        LeftPressed = False
    else:
        LeftPressed = False

    r = ss.getpixel(xy=(902, 724))[0]
    if 225 < r <= 255:
        pydirectinput.keyDown('w')
        MiddleLeftPressed = True
    elif MiddleLeftPressed:
        pydirectinput.keyUp('w')
        MiddleLeftPressed = False
    else:
        MiddleLeftPressed = False

    r = ss.getpixel(xy=(1016, 724))[0]
    if 225 < r <= 255:
        pydirectinput.keyDown('o')
        MiddleRightPressed = True
    elif MiddleRightPressed:
        pydirectinput.keyUp('o')
        MiddleRightPressed = False
    else:
        MiddleRightPressed = False

    r = ss.getpixel(xy=(1132, 724))[0]
    if 225 < r <= 255:
        pydirectinput.keyDown('p')
        RightPressed = True
    elif RightPressed:
        pydirectinput.keyUp('p')
        RightPressed = False
    else:
        RightPressed = False
  

это происходит 4 раза с 4 разными местоположениями и клавишами, и все работает нормально, но это просто способ замедления, когда не обнаружено ни одного пикселя, цикл занимает около 0,06 с, но когда обнаружен и нажат любой пиксель (или нажатие клавиши), цикл занимает от 0,2 с до 0,4 с, естьлюбой способ улучшить это, попытался проверить профилировщик, но понятия не имел, как использовать его в цикле while.
Редактировать: загрузка процессора и оперативной памяти составляет 0,2- 2% для pycharm при выполнении кода

Комментарии:

1. Пожалуйста, опубликуйте самый короткий полный. исходный код py, который воспроизводит проблему.

2. Добавлен полный код в post

3. Python 3 выдает мне IndentationError: unexpected indent в строке 12 ( region info ) для вашего кода. Не могли бы вы опубликовать правильный код без изменений?

4. информация о регионе содержит #, но не может опубликовать # здесь, потому что это делает текст странным

5. Можно размещать код со строками, начинающимися с # . Разместите весь код между строками « (3 обратных символа). Синтаксис называется Markdown .

Ответ №1:

  • Вы можете избавиться от всех else предложений, поскольку каждая из переменных должна быть уже False при else достижении блока.
  • Если r находится в диапазоне 0 ..255, нет необходимости сравнивать его с 255; можно просто использовать: 225 < r
  • Вместо того, чтобы захватывать весь экран, вы можете передать прямоугольник ImageGrab.grab (наименьший прямоугольник, содержащий четыре точки, которые вы используете).

Ни один из них не кажется, что они будут отличным ускорением, за исключением, возможно, ImageGrab bbox.

Что касается профилировщика, вам нужно будет изменить while цикл на a for _ in range(1000) или аналогичный, чтобы он выполнялся в течение 3-7 минут, а затем останавливался. Вам также может потребоваться разбить код на функции, я думаю, что большинство профилировщиков python профилируют только целые функции, а не отдельные строки кода.

Комментарии:

1. Я попытался добавить bbox в imagegrab, но тогда позиции пикселей отличаются, и я не знаю, как вычислить новые

2. Чтобы вычислить новые координаты, вычтите левую и верхнюю координаты поля… Если вы хотите проверить, вы также можете попросить PIL сохранить захваченное изображение в файл, а затем просмотреть его в редакторе изображений. Однако вычитание левой и верхней координат должно быть правильным.

3. Добавлено спасибо, bbox теперь составляет всего 300 пикселей, но он все еще очень медленный, я попытаюсь создать 4 разных сценария, у каждого из которых есть своя полоса, может быть, это будет работать лучше

4. 4 разных скрипта, запущенных параллельно, сделали это намного лучше

5. Теперь он может достигать 2 или 3 одновременно, и каждый из них быстрее примерно на 50 мс