python - 最快的截图库python/提高mss包的性能
问题描述
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()
解决方案
我是 MSS 开发人员 :)
完全不偏不倚,我认为没有比MSS更快的了。但是,如果我们可以让它更快,那我 +1000 :)
for
与 MSS 无关的一点改进是从循环中移出 vars :
@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 中添加到方法中。丑陋,但为了测试它是可以的。
在这种方法中,有两件事可能需要时间:
我很想知道该方法中代码在哪里较慢。
推荐阅读
- javascript - 让链接跟随剪辑路径
- rust - 如何用外设句柄清除中断?嵌入式锈
- xamarin - 我在使用 xamarin 表单的共享转换插件时遇到问题。将在正文中发布指向问题的链接
- java - 从 Java MemorySegment 高效读取的模式
- pdf - 将 ExtGState 分配给 PDF 中的笔画不起作用
- python - 我的 LinkedIn Webscraper 似乎只导航到登录页面,而不是登录后选择的页面
- c# - 使用 DirectorySearch 从 LDAP 查询中检索组名
- c# - 如何在清单中选择多个值?
- iis - 浏览器在 VPN 下不提示输入客户端证书
- python - 集合中具有相同精确哈希值的对象