Самый быстрый скриншот библиотеки Python / улучшить производительность пакета MSS - PullRequest
0 голосов
/ 05 февраля 2019

python 3.6, Windows 10: я пытаюсь сделать один (частичный) снимок экрана каждые 1-5 миллисекунд, чтобы затем запустить на нем пользовательский OCR для извлечения некоторых данных.Мой код для снятия снимков экрана с использованием пакета mss занимает от 16 до 47 мс в зависимости от количества пикселей, которые я пытаюсь захватить.

У меня есть 3 отдельные строки вопросов:

1.)Есть ли альтернатива mss, которая быстрее?

2.) Есть ли способ ускорить mss в 2-3 раза?

3.) Как я могу узнать через профилирование кода /Вывод cProfile, показанный ниже, как я могу добиться улучшения производительности?То, как я читаю вывод, состоит в том, что в функции «захват» тратится много времени, но неясно, что внутри функции захвата действительно занимает так много времени.

from mss import mss
import mss.tools as mss_tools
import cProfile, pstats, io

def profile(fnc):
    def inner(*args, **kwargs):
        pr = cProfile.Profile()
        pr.enable()
        retval = fnc(*args, **kwargs)
        pr.disable()
        s = io.StringIO()
        sortby = 'cumulative'
        ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
        ps.print_stats()
        print(s.getvalue())
        return retval

    return inner

@profile
def main():
    with mss() as sct:
        for i in range(100):
            monitor = sct.monitors[1]
            left = monitor["left"]
            top = monitor["top"]
            right = left + 1
            lower = top + 1
            bbox = (left, top, right, lower)
            shot = sct.grab(bbox)
            # mss_tools.to_png(shot.rgb, shot.size, output='partialscreen.png') #no performance difference with or without this
            # sct.shot() #code takes much more time (almost factor 10 higher compared to taking a large share of the screen)

main()

1 Ответ

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

Я разработчик MSS:)

Совершенно беспристрастно, я не думаю, что там быстрее, чем MSS.Но если мы сможем сделать это еще быстрее, я +1000:)

Небольшое улучшение, не связанное с MSS, заключалось бы в удалении переменных из цикла for:

@profile
def main():
    with mss() as sct:
        monitor = sct.monitors[1]
        left = monitor["left"]
        top = monitor["top"]
        right = left + 1
        lower = top + 1
        bbox = (left, top, right, lower)
        for i in range(100):
            shot = sct.grab(bbox)

Чтобы измерить, что происходит внутри MSS.grab(), возможно, вы могли бы добавить @profile к методу в MSS.Ужасно, но для тестирования это нормально.

В этом методе есть 2 вещи, которые могут занять время:

Мне любопытно узнать, где код медленнее в методе.

...