为什么时差会变慢。perf_counter会随着时间的过去而变慢

时间:2019-11-14 17:55:07

标签: python python-3.x

我正在做一个学校项目,必须在一段时间内从插入arduino的加速度计读取值并将其写入csv文件。 为了提高读数的准确性,我将捕获器传输的所有值都放在一个列表中,每[X]秒执行一次平均值,然后将这些值存储到最终列表中,然后再将它们写入我的csv文件。 为此,我使用time.perf_counter()能够准确准确地知道何时收集这些值。

在1秒内启动1000个值的测试时,第一个值很好,除了有一点点漂移,但这并没有给我带来太大的麻烦。但是,在40值之后,读数间隔为0.01s而不是0.001s(这是可以预期的)

不确定它是否有任何价值,但我正在Pycharm上运行python 3.7。

import serial
import time
import csv
import numpy as np
ser = serial.Serial('COM5',9600)
while True:
    print("Initialisation", end="")
    time.sleep(0.2)
    for x in range(0,3):
        print(".", end="")
        time.sleep(0.3)
    entre=input('\nPress S to begin input or Q to quit')
    if entre=='S':
        del entre                                         #On supprime entre pour boucle infinie
        X=[]
        Y=[]
        Z=[]
        total=[]

        temps_de_mesure=1
        nombre_de_mesure = 1000
        intervalle_entre_2_mesures = temps_de_mesure/nombre_de_mesure    #Recupèrer toutes les valeurs
        t0 = time.perf_counter()
        for x in range(0, nombre_de_mesure):
            t_repeat = time.perf_counter()
            liste_temporaire = [[], [], []]

            while time.perf_counter()-t_repeat < 0.001:
                temp = str(ser.readline())
                temp = temp[2:-5]
                temp = temp.split(';')
                liste_temporaire[0].append(int(temp[0]))
                liste_temporaire[1].append(int(temp[1]))
                liste_temporaire[2].append(int(temp[2]))

            t_moyenne=time.perf_counter()-t0
            x_moyenne=np.mean(liste_temporaire[0])
            y_moyenne=np.mean(liste_temporaire[1])
            z_moyenne=np.mean(liste_temporaire[2])

            total.append([t_moyenne,x_moyenne,y_moyenne,z_moyenne])


        print(total) #affichage résultat

        with open('acquision.csv','w', newline='') as csvFile:         #Création d'un fichier csv acquisition avec les valeurs
            writer=csv.writer(csvFile)
            writer.writerows(total)
        csvFile.close()

    elif entre=='Q':break

ser.close()

0 个答案:

没有答案