我编写此代码来读取文件,因为它是通过切换游戏中的开关来控制灯泡的。该开关会将字符串附加到该文件。该程序有效,但速度很慢。它从中读取的文件有超过15k行要迭代,因此只能每隔一秒左右更新一次。有没有办法加快速度?谢谢!
import serial
s = serial.Serial(port = "COM3", baudrate = 9600)
def file_len():
try:
with open("file", "r") as f:
for r, l in enumerate(f):
pass
return r + 1
except:
pass
def toggle(data, value):
if(data.find("Clap Off!") == 0 and value == True):
print("Off")
s.write("RelayOff")
elif(data.find("Clap On!") == 0 and value == False):
print("On")
s.write("RelayOn")
truth = False
while True:
try:
file = open("file", "r")
for i, line in enumerate(file):
if i == (file_len() - 2):
toggle(data = file.readline(), value = truth)
truth = not truth
file.close()
except:
pass
编辑: 我尝试使用以下方法绕过while file_len函数:
while True:
try:
file = open("file", "r")
file.seek(-1, 2)
#print(file.readline())
toggle(data = file.readline(), value = truth)
file.close()
truth = not truth
except:
pass
但它引发了错误“io.UnsupportedOperation:不能做非零终端相对搜索” 这只是seek()的工作方式,还是有办法从文件末尾向后搜索?
答案 0 :(得分:2)
考虑一下您的file_len
功能。它有什么作用?每次调用它时都会读取整个文件。
想想你的主循环。它还会读取整个文件。然后它对文件中的每一行做了什么?它会调用file_len
。
如果文件有5行,你读取整个文件的次数是多少? 10行? 100行? 15000行?
有一些工具可以帮助您找到程序中的热点 - 例如cProfile stdlib模块。但是,只需考虑一分钟的程序比生成和分析配置文件更快,并且可以产生同样好的结果。