加速文件I / O.

时间:2013-09-17 18:11:46

标签: 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 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()的工作方式,还是有办法从文件末尾向后搜索?

1 个答案:

答案 0 :(得分:2)

考虑一下您的file_len功能。它有什么作用?每次调用它时都会读取整个文件。

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

如果文件有5行,你读取整个文件的次数是多少? 10行? 100行? 15000行?

有一些工具可以帮助您找到程序中的热点 - 例如cProfile stdlib模块。但是,只需考虑一分钟的程序比生成和分析配置文件更快,并且可以产生同样好的结果。