1

私は次のことを行う簡単なプログラムを持っています.

プログラムは正常に動作します。問題は 1 つだけです。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:ます。そこにsleepまたはpyautogui.PAUSEを挿入します (while ループ内の の前if)。プロセスがしばらく (1 秒未満でも) スリープすると、多くの CPU サイクルが解放されます。

マイナーな最適化: また、すべてのループで User32.dll 全体を初期化しています... 2 回 ( or. そしてUser32は巨大です

ヒントと注意事項:

Pythonのルールを正しく覚えていればhllDll、モジュールレベル(関数定義の上)に移動するだけで、get_space_state()とにかくそれを見つけることができます。または、パラメーターとして渡すこともできます。また、関数呼び出しごとに VK_SPACE を再定義する必要はありませんが、これはマイクロ最適化です

これらの修正がすべて機能しない場合は、デバッガーを使用して、スローダウンの真の原因を見つける必要があります。

将来このような問題が発生した場合は、ImmunityWinDbgなどを使用してプロセスにアタッチし、そこで何が起こっているかを確認してください。

于 2016-05-22T11:00:23.520 に答える