【问题标题】:Speed up file I/O加快文件 I/O
【发布时间】:2013-09-22 07:26:42
【问题描述】:

我编写此代码是为了读取一个文件,因为它正在被写入通过切换游戏中的开关来控制灯。该开关会导致将字符串附加到文件中。该程序有效,但速度很慢。它读取的文件有超过 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: can't do nonzero end-relative seeks” 这只是 seek() 的工作方式,还是有办法从文件末尾向后搜索?

【问题讨论】:

  • 您的s.write() 不包含换行符;与print() 不同,使用file.write() 不会自动添加\n。您的数据在最后一行被连接起来。
  • 这个问题的全部目的是找出如何避免遍历整个文件,而只是针对 EOF 之前的行。
  • 公平点;我敢肯定,这里还有其他重复项。撤回了我提议的欺骗。
  • 快速仅供参考,如果 file.seek(n, 2) 相对于文件末尾是 n,则 -1 表示超出文件末尾。您想改为尝试 0。

标签: python file-io python-3.x


【解决方案1】:

想想你的file_len 函数。它有什么作用?每次调用它都会读取整个文件。

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

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

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

【讨论】:

  • 已解决!我找到了 linecache 模块,它可以让我读取文件中任何行的内容。
  • 很遗憾听到这个消息。
  • 行缓存效率低吗?它至少可以将我的程序加速到大约每 150 毫秒检查一次文件更新的速度,这是一个巨大的改进。
  • 听起来你似乎避免真正理解程序中问题的原因,即使你找到了一种让它运行得更快的方法。这是我很抱歉的部分。
猜你喜欢
  • 2012-05-01
  • 2010-12-25
  • 2020-11-17
  • 2015-07-05
  • 2015-11-13
  • 2016-02-09
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多