Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python会导致速度减慢?_Python_Evdev - Fatal编程技术网

为什么Python会导致速度减慢?

为什么Python会导致速度减慢?,python,evdev,Python,Evdev,我已经用Python 3为我的RaspberryPi编写了一个简单的应用程序。我的rpi有一个新的安装,并且在开始开发之前我已经完成了所有更新。此应用程序是一个体育记分板,显示在LED矩阵上,并利用蓝牙游戏控制器和evdev模块进行输入控制 蓝牙输入工作得很好,100%响应,但如果断开连接,应用程序将崩溃,因为它无法再访问/dev/input/event0(这是gamepad输入) 我在代码中添加了try-Exception,它解决了崩溃问题,并允许在gamepad断开连接时代码继续。这带来了两

我已经用Python 3为我的RaspberryPi编写了一个简单的应用程序。我的rpi有一个新的安装,并且在开始开发之前我已经完成了所有更新。此应用程序是一个体育记分板,显示在LED矩阵上,并利用蓝牙游戏控制器和evdev模块进行输入控制

蓝牙输入工作得很好,100%响应,但如果断开连接,应用程序将崩溃,因为它无法再访问/dev/input/event0(这是gamepad输入)

我在代码中添加了try-Exception,它解决了崩溃问题,并允许在gamepad断开连接时代码继续。这带来了两个我需要帮助的新问题

  • 现在大约有10%的gamepad输入没有注册。有时必须按两次按钮才能注册

  • 控制台中的Ctl-C不会停止代码执行。我将在控制台中获取以下内容:

    键盘中断: ^CEException在以下情况中被忽略:

  • 如果我删除了除gamepad读取之外的try,它将正常工作,直到gamepad断开连接。这是有问题的代码

    while True:
        #Gamepad read
        try:
            dev = InputDevice('/dev/input/event0')    
            gen = dev.read()
        except Exception:
            pass
        #Gamepad functions
        try:
            for ev in gen:
                if ev.type == ecodes.EV_KEY:
                    if ev.value == 1:
                        if ev.code == 23:
                            if home == 0:
                                pass
                            else:
                                home-=1 
                        elif ev.code == 35:
                            home+=1 
                        elif ev.code == 34:
                            away+=1 
                        elif ev.code == 36:
                            if away==0:
                                pass
                            else:
                                away-=1
                        elif ev.code == 49:
                            stopwatch.reset()
                            start_clock == 300
                        elif ev.code == 32:
                            start_clock+=1
                        elif ev.code == 46:
                            start_clock-=1
                        elif ev.code == 33:
                            start_clock+=60
                        elif ev.code == 18:
                            start_clock-=60        
                        elif ev.code == 24:
                            away=00
                            home=00
                        elif ev.code == 37:
                            _draw_ani()
                        elif ev.code == 50:
                            if stopwatch.running:
                                stopwatch.stop()
                            else:
                                stopwatch.start()   
        except IOError:
            pass
    

    通常,使用
    try/except
    进行检查的成本很高,特别是在引发异常时。这是一个很好的参考,可以在这方面帮助你

    我认为使用
    if/else
    条件将减少负载。为此,您应该首先检测引发异常的原因(您可以使用
    exception as error
    并分析
    error
    对象)。然后,您可以使用
    if/else
    检查条件

    关于您的代码,请将
    一起使用,而不是像这样直接打开和阅读:

    with InputDevice('/dev/input/event0').read() as gen:
        # do stuff with gen obj
    
    这样您就不需要手动关闭obj。
    现在,代码中的一个问题是试图在设备打开时读取设备。

    为什么每次迭代都要创建InputDevice对象?
    除了异常之外是个坏主意,请捕获特定错误。