Google X Coursera第四周实验:如何按建议完成Python脚本完整优化?
优化get_same_or_newer()函数的两种具体实现方案
方案一:构建日期分组字典
核心思路
一次性读取所有数据后,将条目按start_date分组存入字典,键为标准化的日期对象/字符串,值为对应日期的所有条目。后续查询时只需筛选字典中符合日期条件的键,直接提取对应条目,避免全量遍历。
代码实现
- 预处理构建日期字典(仅执行一次):
from datetime import datetime # 读取原始数据(仅执行一次) FILE_DATA = get_file_lines(FILE_URL) def build_date_group_dict(data): date_dict = {} for line in data: # 按实际数据格式拆分,提取start_date字段,此处假设拆分后索引为2 parts = line.split(',') date_str = parts[2].strip() # 转换为datetime对象,确保日期比较的准确性 date_obj = datetime.strptime(date_str, '%Y-%m-%d') # 按日期分组存入字典 if date_obj not in date_dict: date_dict[date_obj] = [] date_dict[date_obj].append(line) return date_dict # 全局预处理生成日期字典 DATE_GROUP_DICT = build_date_group_dict(FILE_DATA)
- 优化后的
get_same_or_newer():
def get_same_or_newer(start_date): target_date = datetime.strptime(start_date, '%Y-%m-%d') result = [] # 遍历字典中所有大于等于目标日期的分组 for date in DATE_GROUP_DICT: if date >= target_date: result.extend(DATE_GROUP_DICT[date]) return result
方案二:按start_date排序+二分查找
核心思路
先将所有条目按start_date升序排序,查询时用二分查找定位第一个符合日期条件的条目位置,直接截取后续所有条目,将查询时间复杂度从O(n)降至O(log n),适合高频查询场景。
代码实现
- 预处理排序数据(仅执行一次):
from datetime import datetime import bisect # 读取原始数据(仅执行一次) FILE_DATA = get_file_lines(FILE_URL) def sort_data_by_start_date(data): # 定义提取日期的辅助函数 def extract_date(line): parts = line.split(',') date_str = parts[2].strip() return datetime.strptime(date_str, '%Y-%m-%d') # 按日期升序排序数据 sorted_data = sorted(data, key=extract_date) # 提取对应的日期列表,用于二分查找 date_list = [extract_date(line) for line in sorted_data] return sorted_data, date_list # 全局预处理生成排序后的数据和日期列表 SORTED_DATA, DATE_LIST = sort_data_by_start_date(FILE_DATA)
- 优化后的
get_same_or_newer():
def get_same_or_newer(start_date): target_date = datetime.strptime(start_date, '%Y-%m-%d') # 二分查找第一个大于等于目标日期的索引 match_idx = bisect.bisect_left(DATE_LIST, target_date) # 截取索引后的所有条目作为结果 return SORTED_DATA[match_idx:]
注意事项
- 需根据实际数据的日期格式调整
strptime()中的格式字符串(比如'%m/%d/%Y')。 - 所有预处理逻辑仅需执行一次,放在函数外部或全局作用域,避免重复计算。
内容的提问来源于stack exchange,提问作者Jaidon Lee
相关产品推荐
相关产品推荐

