es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Necesito convertir una cadena de texto a un número entero rápidamente en Python.

Tengo un programa que supuestamente toma lecturas de la posición del joystick desde un Arduino (a través de serial) y las traduce en movimientos del ratón en mi computadora.

Solo hay un problema con esto…
La conversión de cadena a entero es demasiado lenta y tarda una eternidad en registrar los movimientos. Necesito una forma más rápida de convertir una cadena en un valor entero o una forma de evitar la conversión por completo.

Este es mi código actual:

import serial
import pyautogui
import time

ser = serial.Serial('COM3', 9600, timeout=1)
while True:
    time.sleep(0.0001)
    ser_bytes = ser.readline()
    decoded_bytes = ser_bytes[0:len(ser_bytes)-2].decode("utf-8")
    pos = decoded_bytes.split(':')
    xpos = int(pos[0])
    ypos = int(pos[1])
    print("x:", xpos, " y:", ypos)
    pyautogui.move(xpos, ypos)

Nota: La salida del Arduino tiene 3 valores:
0:0:0
Primer número: x
Segundo número: y
Tercer número: botón del joystick

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    Existen algunas formas de mejorar el rendimiento de la conversión de cadena a entero en el código.

    Una forma es utilizar la función map() para convertir la lista de cadenas en una lista de enteros de una sola vez. Aquí hay un ejemplo:

    import serial
    import pyautogui
    import time
    
    ser = serial.Serial('COM3', 9600, timeout=1)
    
    while True:
        time.sleep(0.0001)
        ser_bytes = ser.readline()
        decoded_bytes = ser_bytes[0:len(ser_bytes)-2].decode("utf-8")
    
        pos = decoded_bytes.split(':')
        xpos, ypos = map(int, pos[:2])
    
        print("x:", xpos, "y:", ypos)
        pyautogui.move(xpos, ypos)
    

    Otra forma es utilizar numpy y su función fromstring(), la cual puede convertir directamente una cadena de bytes en un arreglo de numpy de enteros. Aquí hay un ejemplo:

    import serial
    import pyautogui
    import time
    import numpy as np
    
    ser = serial.Serial('COM3', 9600, timeout=1)
    
    while True:
        time.sleep(0.0001)
        ser_bytes = ser.readline()
        decoded_bytes = ser_bytes[0:len(ser_bytes)-2].decode("utf-8")
    
        pos = np.fromstring(decoded_bytes, sep=':', dtype=np.int)
        xpos, ypos = pos[:2]
    
        print("x:", xpos, "y:", ypos)
        pyautogui.move(xpos, ypos)
    

    Ambos enfoques deberían resultar en una mejora significativa en el programa. Otra opción es utilizar un protocolo de comunicación serial más eficiente, como la codificación binaria en lugar de la codificación textual.

Comments are closed.