如何在 Python 中加速字符串拆分

Posted

技术标签:

【中文标题】如何在 Python 中加速字符串拆分【英文标题】:How to speed up string splitting in Python 【发布时间】:2017-05-22 16:03:50 【问题描述】:

我正在使用 Tkinter GUI 从 Arduino 接收数据,需要以每秒 20 个样本接收 8 个不同的值并绘制它们。我在一张图上绘制 4,在另一张图上绘制 4。 Arduino 端的代码工作正常,并且使用以下格式以正确的速率发送。

Serial.println(String(val1) + "," + String(val2) + ...

在 Python 方面,我收到并绘制如下图:

def update_graph(self, i):
    self.xdata.append(i)
    while (self.arduinoData.inWaiting()==0):
        pass
    x = self.arduinoData.readline()
    split_data = x.split(",")
    print split_data[1]
    self.ydata1.append(int(split_data[0]))
    self.ydata2.append(int(split_data[1]))
    self.ydata3.append(int(split_data[2]))
    self.ydata4.append(int(split_data[3]))
    self.ydata5.append(int(split_data[4]))
    self.ydata6.append(int(split_data[5]))
    self.ydata7.append(int(split_data[6]))
    self.ydata8.append(int(split_data[7]))
    self.line1.set_data(self.xdata, self.ydata1)
    self.line2.set_data(self.xdata, self.ydata2)
    self.line3.set_data(self.xdata, self.ydata3)
    self.line4.set_data(self.xdata, self.ydata4)
    self.ax1.set_ylim(min(self.ydata1), max(self.ydata4))
    self.ax1.set_xlim(min(self.xdata), max(self.xdata))
    self.line5.set_data(self.xdata, self.ydata5)
    self.line6.set_data(self.xdata, self.ydata6)
    self.line7.set_data(self.xdata, self.ydata7)
    self.line8.set_data(self.xdata, self.ydata8)
    self.ax2.set_ylim(min(self.ydata5), max(self.ydata8))
    self.ax2.set_xlim(min(self.xdata), max(self.xdata))
    if i >= self.points - 1:
        self.running = False
        self.ani = None
    return self.line1,
    return self.line2,
    return self.line3,
    return self.line4,
    return self.line5,
    return self.line6,
    return self.line7,
    return self.line8,

事实证明,这太慢了,无法跟上传入的数据。有没有更快的方式接收和解析数据?

【问题讨论】:

我怀疑接收和解析数据是最慢的部分。 您可以以打包的二进制格式发送该数据,然后使用struct 模块将其解包。 @gre_gor 即使我在没有绘图命令的情况下运行它,它也会显着落后 你知道第一个return之后的任何代码都不会执行吗? set_data 是做什么的?我的猜测是这是一个昂贵的函数调用,因为实际的拆分只需要几微秒。 【参考方案1】:

我同意@gre_gor 的观点,即解析不是最慢的部分。不久前,我在做一个类似的项目,发现将 arduino 设置为更高的串行速度就可以了。

void setup()
    Serial.begin(115200);

【讨论】:

嗯,这就是我所拥有的。减少 arduino 发送的数据总是一个好主意。 我正在读取 4 个不同的线性执行器的位置以及与每个执行器相关的传感器,所以这对我来说不是一个可行的解决方案,但感谢您的建议

以上是关于如何在 Python 中加速字符串拆分的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中拆分具有多个分隔符的字符串? [复制]

在 Python 中,如何将字符串拆分为多个整数?

Python - 如何在拆分字符串时忽略双引号中的空格? [复制]

在 Python 中,如何拆分字符串并保留分隔符?

在 Python DataFrame 中拆分字符串

如何使用 re.split 在 python 中拆分两列从 CSV 中查找字符串值