最快的屏幕截图库python/提高mss包的性能

最快的屏幕截图库python/提高mss包的性能,python,performance,screenshot,cprofile,python-mss,Python,Performance,Screenshot,Cprofile,Python Mss,python 3.6、Windows 10: 我试图每1-5毫秒拍摄一个(部分)屏幕截图,然后在上面运行一些自定义OCR来提取一些数据。 我使用mss软件包拍摄屏幕截图的代码需要16到47毫秒,这取决于我尝试捕获的像素数 我有三行独立的问题: 1.)是否有比mss更快的替代方案 2.)是否有办法将mss的速度提高2-3倍 3.)如何通过下面显示的代码评测/cProfile输出了解如何实现性能改进?我读取输出的方式是,在“grab”函数中花费了很多时间,但不清楚grab函数中到底花了多少时间 fr

python 3.6、Windows 10: 我试图每1-5毫秒拍摄一个(部分)屏幕截图,然后在上面运行一些自定义OCR来提取一些数据。 我使用mss软件包拍摄屏幕截图的代码需要16到47毫秒,这取决于我尝试捕获的像素数

我有三行独立的问题:

1.)是否有比mss更快的替代方案

2.)是否有办法将mss的速度提高2-3倍

3.)如何通过下面显示的代码评测/cProfile输出了解如何实现性能改进?我读取输出的方式是,在“grab”函数中花费了很多时间,但不清楚grab函数中到底花了多少时间

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()
我是MSS开发者:)

完全公正地说,我认为没有比MSS更快的了。但如果我们能让它更快,我就+1000:)

与MSS无关的一点改进是将VAR从
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中的方法中。丑陋,但测试它是好的

在该方法中,有两件事可能需要时间:

我很想知道在这个方法中,代码在哪里比较慢