【问题标题】:Need to convert strint to int quickly python需要快速将字符串转换为int python
【发布时间】:2022-01-26 00:40:55
【问题描述】:

我有一个程序应该从 arduino(通过串行)获取操纵杆位置读数,并将它们转换为我计算机上的鼠标移动。

这只有一个问题...
字符串到整数的转换太慢了,而且动作要花很长时间才能注册。
我需要一种更快的方法来将字符串转换为整数值,或者完全跳过转换。

这是我当前的代码:

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)

注意:arduino 的输出具有 3 值: 0:0:0 第一个数字:x 第二个数字:y 第三个数字:摇杆按钮

【问题讨论】:

  • 为什么不删除 time.sleep()?
  • sleep()ser.readline()print(...) 语句可能比 int() 语句昂贵得多。
  • print 语句仅用于调试,但 sleep() 语句是为了避免程序不断崩溃的错误,而 ser.readline() 语句很关键,因为它从arduino。
  • 你确定字符串到整数的转换实际上是瓶颈吗?您如何验证这一点?
  • 我已经通过取出代码片段验证了这一点,主要瓶颈是字符串到整数的转换,另一个大瓶颈是 time.sleep() 语句,但这应该会变慢将代码缩减非常少,以避免串行通信错误。

标签: python time pyautogui


【解决方案1】:

也许这样的事情会起作用?这样,每次调用move() 时,您可以读取多行输入。某些输入行将被忽略,但如果您的输入速度快于使用速度,这似乎是必要的。

import serial
import pyautogui
import time

ser = serial.Serial('COM3', 9600, timeout=1)
while True:
    time_to_move = time.time() + 0.001
    while True:
        ser_bytes = ser.readline()
        if time.time() >= time_to_move:
            break
    x_bytes, y_bytes = ser_bytes[:-2].split(b':')
    x, y = int(x_bytes), int(y_bytes)
    pyautogui.move(x, y)

【讨论】:

  • 我尝试了你的代码,但它给了我以下错误:ValueError: too many values to unpack (expected 2)。有没有办法为 3 个值修改它?
  • 然后把x_bytes, y_bytes = ...改成x_bytes, y_bytes, *_ = ...
  • 或者任何其他数量的小修复,比如先做split = ser_bytes[:-2].split(b':')然后x = int(split[0])y = int(split[0])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2017-03-16
  • 2011-06-17
相关资源
最近更新 更多