Я работаю над проектом, который требует данных датчика от датчика температуры. При доступе к файлу с помощью open(), а затем read() мы обнаружили, что это занимает слишком много времени. У нас есть отдельная проблема для read(), занимающая больше всего времени (примерно 1 секунду). Есть ли более быстрая альтернатива read() или я использую ее неправильно? Код:
import time, os, socket
#External thermometer address: 28-031897792ede
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
temp_sensor = '/sys/bus/w1/devices/28-031897792ede/w1_slave'
def temp_raw():
f = open(temp_sensor, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp():
lines = temp_raw()
while lines[0].strip()[-3:] != 'YES':
lines = temp_raw()
temp_output = lines[1].find('t=')
if temp_output != -1:
temp_string = lines [1].strip()[temp_output+2:]
temp_c = float(temp_string) / 1000.0
return round(temp_c, 1)
while True:
temp_raw()
lines = f.read()
будьте осторожны, возможно, вы имеете в видуlines = f.readlines()
- person Jean-François Fabre   schedule 09.05.2019while lines[0].strip()[-3:] != 'YES': lines = temp_raw()
так как вы читаете файл каждый раз, поэтому, если он совпадает один раз, он совпадает навсегда - person Jean-François Fabre   schedule 09.05.2019read_temp
. У вас есть неэффективный бесконечный цикл, который читает файл и завершает работу без какой-либо обработки. Пожалуйста, опишите, что вы пытаетесь сделать с этим. Я не уверен, почему вы пропустили примеры руководств по работе с файлами для этой реализации. - person Prune   schedule 09.05.2019readlines
. Опять же, какова цель этого кода? Даже если вы вызываетеread_temp
, кажется, что все, что делает эта функция, — это находит одну строку в файле и извлекает конкретное полеfloat
. С этой целью он читает весь файл. Эту функциональность, вероятно, лучше реализовать с помощью команды ОС (например,awk
в UNIX). - person Prune   schedule 09.05.2019awk
использует системный вызовread()
, точно так же, как Python и любая другая программа пользовательского пространства, которая взаимодействует с файлоподобными объектами в UNIX, так что вы не увидите значительного улучшения в блокировке вызова одним языком по сравнению с чужое). - person Charles Duffy   schedule 09.05.2019