Python 加快文件I/O速度

Python 加快文件I/O速度,python,file-io,python-3.x,Python,File Io,Python 3.x,我写这段代码是为了在游戏中通过切换开关来控制一盏灯时读取一个文件。该开关会将字符串追加到文件中。这个程序可以运行,但速度很慢。它读取的文件有超过15k行需要迭代,因此只能每隔一秒左右更新一次。有没有办法加快速度?谢谢 import serial s = serial.Serial(port = "COM3", baudrate = 9600) def file_len(): try: with open("file", "r") as f: for

我写这段代码是为了在游戏中通过切换开关来控制一盏灯时读取一个文件。该开关会将字符串追加到文件中。这个程序可以运行,但速度很慢。它读取的文件有超过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()的工作方式,还是有一种从文件末尾向后搜索的方式?

想想您的
文件\u len
函数。它有什么用?每次调用它时,它都会读取整个文件

想想你的主循环。它还读取整个文件。然后它对文件中的每一行做什么?它调用
文件\u len

如果文件有5行,您将读取整个文件多少次?10行?100行? 15000行


有一些工具可以帮助您找到程序中的热点,例如cProfile stdlib模块。然而,仅仅思考一下您的程序就比生成和分析概要文件要快,并且可以产生同样好的结果。

您的
s.write()
不包括换行符;与
print()
不同,使用
file.write()
不会自动添加
\n
。您的数据被连接到最后一行。还可以看到这个问题的全部目的是为了找出如何避免遍历整个文件,而只是针对EOF.Fair point之前的行;我敢肯定,这里还有其他的复制品。撤回我建议的dupe.Quick供参考,如果
文件.seek(n,2)
相对于文件结尾是
n
,则-1表示超出文件结尾。您想改为尝试0。已解决!我找到了linecache模块,它可以让我读取文件中任何一行的内容。听到这个消息我很抱歉。linecache是否效率低下?它至少可以使我的程序加速到大约每150毫秒检查一次文件更新的速度,这是一个巨大的改进。听起来好像你没有真正理解程序中问题的原因,尽管你找到了一种方法使它运行得更快。这是我很抱歉的部分。