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

时间:2019-02-05 17:51:15

标签: python performance screenshot cprofile python-mss

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

我有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 :(得分:1)

我是MSS开发人员:)

完全公正地说,我认为没有比MSS更快的了。但是,如果我们可以加快速度,那我就是+1000:)

与MSS无关的一点改进是将data-*循环中的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()添加到MSS的方法中。丑陋但可以测试。

在该方法中,可能需要花费两件事:

我很好奇,知道该方法中的代码运行速度较慢。