Clicker 占用大量处理器时间 - python 3
clicker eats a lot of processor time - python 3
我有一个简单的程序可以执行以下操作:
1)用户将鼠标指向某处,
2) 然后用户按下 Space,
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)
非常感谢。
正确答案:我怀疑是因为 while True:
导致的持续轮询。在那里插入 sleep or pyautogui.PAUSE(在 while 循环内,在 if
之前),如果进程休眠一段时间(甚至不到一秒),它会释放很多 CPU 个周期
小优化:
此外,您似乎在每个循环中初始化整个 User32.dll...两次(因为 or
)。
而 User32 是 HUGE
提示和注意事项:
如果我没记错 python 规则,你只需将 hllDll
移动到模块级别(在函数定义之上),get_space_state()
无论如何都会找到它。或者您可以将其作为参数传递。而且您不需要重新定义 VK_SPACE 每个函数调用 - 尽管这是一个微优化
如果所有这些修复都不起作用,您应该使用调试器,找到真正的减速源
我有一个简单的程序可以执行以下操作: 1)用户将鼠标指向某处, 2) 然后用户按下 Space, 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)
非常感谢。
正确答案:我怀疑是因为 while True:
导致的持续轮询。在那里插入 sleep or pyautogui.PAUSE(在 while 循环内,在 if
之前),如果进程休眠一段时间(甚至不到一秒),它会释放很多 CPU 个周期
小优化:
此外,您似乎在每个循环中初始化整个 User32.dll...两次(因为 or
)。
而 User32 是 HUGE
提示和注意事项:
如果我没记错 python 规则,你只需将 hllDll
移动到模块级别(在函数定义之上),get_space_state()
无论如何都会找到它。或者您可以将其作为参数传递。而且您不需要重新定义 VK_SPACE 每个函数调用 - 尽管这是一个微优化
如果所有这些修复都不起作用,您应该使用调试器,找到真正的减速源