根據這個代碼的需求重新寫,新的代碼需要提升運行速度,請修改
时间: 2024-03-27 15:36:09 浏览: 17
为了提高代码的运行速度,可以尝试使用一些优化技巧,例如:
1. 避免重复读取同一个Excel文件。在函数开始之前,可以检查Excel文件是否已经读取,并将其缓存到内存中。如果文件已经读取,则可以直接从缓存中获取数据,而无需重新打开和读取文件。
2. 使用并行处理来加快数据处理速度。如果处理的数据量较大,则可以考虑使用Python内置的`concurrent.futures`库或第三方的多线程/多进程库来并行处理数据。
3. 减少循环和条件判断的次数。在代码中,可能会出现多次循环和条件判断,这些操作会消耗大量的计算资源。可以尝试将这些操作合并为一个循环,并使用布尔运算来简化条件判断。
以下是一个可能的优化版本的代码示例:
```
import os
import datetime
import openpyxl
from concurrent.futures import ThreadPoolExecutor
class ExcelChecker:
def __init__(self, filename):
self.filename = filename
self.data = self.load_data()
self.sheet_names = self.data.sheetnames
def load_data(self):
if not self.filename.endswith('.xlsx'):
self.filename += '.xlsx'
filepath = os.path.join(os.getcwd(), self.filename)
if not os.path.exists(filepath):
wb = openpyxl.Workbook()
wb.save(filepath)
return openpyxl.load_workbook(filepath)
def get_filtered_rows(self, sheet_name):
filtered_rows = []
sheet = self.data[sheet_name]
today = datetime.datetime.now().strftime('%Y/%m/%d')
start_time_1 = datetime.time(8, 0, 0) # 早上8点
end_time_1 = datetime.time(20, 0, 0) # 下午7点
start_time_2 = datetime.time(20, 0, 0) # 晚上8点
end_time_2 = datetime.time(7, 0, 0) # 早上7点
for row in sheet.iter_rows():
if row[2].value == today and row[8].value == sheet_name:
datetime_obj = datetime.datetime.strptime(row[3].value, '%H:%M:%S')
row_time = datetime_obj.time()
if (start_time_1 <= row_time <= end_time_1 and start_time_1 <= datetime.datetime.now().time() <= end_time_1) or (start_time_2 <= row_time or datetime.datetime.now().time() <= end_time_2):
filtered_rows.append(row)
return filtered_rows
def get_status(self, sheet_name):
filtered_rows = self.get_filtered_rows(sheet_name)
if filtered_rows:
return "已點檢"
else:
return "未點檢"
def get_all_statuses(self):
statuses = {}
with ThreadPoolExecutor() as executor:
future_to_sheet = {executor.submit(self.get_status, sheet_name): sheet_name for sheet_name in self.sheet_names}
for future in concurrent.futures.as_completed(future_to_sheet):
sheet_name = future_to_sheet[future]
try:
status = future.result()
statuses[sheet_name] = status
except Exception as exc:
print(f'Sheet {sheet_name} generated an exception: {exc}')
statuses[sheet_name] = "Error"
return statuses
```
在这个版本的代码中,我们将Excel文件的数据加载到内存中,以避免反复读取同一个文件。我们还将`get_filtered_rows`函数中的循环和条件判断合并为一个循环,并使用布尔运算来简化条件判断。最后,我们使用`ThreadPoolExecutor`来并行处理所有的数据表格,以加快整个过程的速度。