You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google X Coursera第四周实验:如何按建议完成Python脚本完整优化?

优化get_same_or_newer()函数的两种具体实现方案

方案一:构建日期分组字典

核心思路

一次性读取所有数据后,将条目按start_date分组存入字典,键为标准化的日期对象/字符串,值为对应日期的所有条目。后续查询时只需筛选字典中符合日期条件的键,直接提取对应条目,避免全量遍历。

代码实现

  1. 预处理构建日期字典(仅执行一次):
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)
  1. 优化后的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),适合高频查询场景。

代码实现

  1. 预处理排序数据(仅执行一次):
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)
  1. 优化后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:45:30