0

ゲームでスイッチを切り替えてランプを制御するために書かれているように、ファイルを読み取るためにこのコードを書きました。このスイッチにより、文字列がファイルに追加されます。プログラムは動作しますが、遅いです。読み取り元のファイルには、15,000 行を超える反復処理が含まれているため、1 秒おきにしか更新できません。それをスピードアップする方法はありますか?ありがとう!

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() が機能する方法ですか、それともファイルの最後から逆方向にシークする方法はありますか?

4

1 に答える 1

2

あなたのfile_len機能について考えてください。それは何をしなければならないのですか?呼び出すたびにファイル全体を読み取ります。

メインループについて考えてください。また、ファイル全体を読み取ります。そして、ファイルの各行に対して何をするのでしょうか? を呼び出しますfile_len

ファイルが 5 行ある場合、ファイル全体を何回読んでいますか? 10行?100行?15000行?

cProfile stdlib モジュールなど、プログラム内のホット スポットを見つけるのに役立つツールがあります。ただし、プログラムについて 1 分間考えただけでも、プロファイルを生成して分析するよりも速く、同じくらい良い結果が得られます。

于 2013-09-17T18:14:35.167 に答える