1

我有一个简单的程序,它执行以下操作:1)用户将鼠标指向某处,2)然后用户按空格键,3)计算机在该点执行一定数量的左键鼠标单击。

该程序运行良好,只有一个问题 - 它在 4 核处理器上占用了 30-50% 的处理器时间。哪里有问题?

import pyautogui
import ctypes

pyautogui.FAILSAFE = True

def get_space_state():
    hllDll = ctypes.WinDLL ("User32.dll")
    VK_SPACE = 0x20
    return hllDll.GetKeyState(VK_SPACE)

while True:
    if get_space_state() == -127 or get_space_state() == -128:
        print ("yes")
        pyautogui.click(clicks=40 , interval=0.01) 

非常感谢。

4

1 回答 1

2

正确答案:我怀疑由于while True:. 在此处插入sleeppyautogui.PAUSE(在 while 循环内, before if),如果进程休眠一段时间(甚至不到一秒),它会释放大量 CPU 周期

次要优化:您or似乎也在每个循环中初始化整个 User32.dll ......两次(因为)。User32很大

提示和注意事项

如果我没记错 python 规则,你可以移动hllDll到模块级别(高于函数定义),get_space_state()无论如何都会找到它。或者您可以将其作为参数传递。而且你不需要重新定义 VK_SPACE 每个函数调用 - 尽管这是一个微优化

如果所有这些修复都不起作用,您应该使用调试器来找到真正的减速源

如果您将来碰巧遇到此类问题,请使用ImmunityWinDbg之类的东西附加到进程并查看那里发生了什么

于 2016-05-22T11:00:23.520 回答