2016-05-22 4 views
1

Ich habe ein einfaches Programm, das Folgendes tut: 1) Benutzer zeigt eine Maus irgendwo, 2) dann drückt Benutzer Space, 3) und Computer macht eine bestimmte Menge von links -Button-Mausklicks an diesem Punkt.Clicker isst eine Menge Prozessorzeit - Python 3

Das Programm funktioniert gut, es gibt nur ein Problem - es isst 30-50% der Prozessorzeit auf einem 4-Core-Prozessor. Wo ist das Problem?

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) 

Vielen Dank.

Antwort

2

Richtige Antwort: Ich vermute eine ständige Abfrage wegen while True:. Legen Sie sleep oder pyautogui.PAUSE dort (im while-Schleife, bevor if), wenn Verfahren für eine Weile schläft (noch weniger als eine Sekunde) es eine Menge von CPU-Zyklen befreit

Minor Optimierungen: Auch Sie initialisiert gesamte User32.dll in jeder Schleife ... zweimal (wegen or) scheint es. Und User32 ist HUGE

Hinweise und Anmerkungen:

Wenn ich Python Regeln recht erinnere, kann man einfach hllDll auf eine Modulebene bewegen (oben Funktion Defintion), get_space_state() es trotzdem finden. Oder Sie können es als Parameter übergeben. Und Sie brauchen nicht VK_SPACE jeden Funktionsaufruf neu zu definieren - wenn dies eine Mikro-Optimierung ist

Wenn all diese Korrekturen nicht funktionieren, sollten Sie Debugger verwenden, eine wahre Quelle der Verlangsamungen zu finden

Wenn Sie haben Probleme wie diese in der Zukunft, verwenden Sie etwas wie Immunity oder WinDbg anhängen zu verarbeiten und sehen, was dort los ist

+0

Vielen Dank für Ihre Antwort. 1) Wie und wo soll ich "schlafen"? 2) über "zweimal" - ich wechselte zu "wenn get_space_state() <0:" - nichts verbessert. 3) Kennen Sie die Art, NOT ganze User32.dll zu initialisieren - aber der einzige benötigte Teil davon? –

+0

leider, nein, ich weiß nicht, wie man eine einzelne Funktion exportiert, aber es wird nicht viel ausmachen, wenn Sie einfach lib einmal exportieren - beim Laden – strangeqargo

+1

Sie sind RECHTS. Das Problem wird mit nur einer Zeile gelöst: "time.sleep (0.02)" wird vor "if" eingefügt. Alles andere spielt keine Rolle. –