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

如何在不使用numpy等工具的前提下加速Python砖块计算代码?

优化方案:从140秒到30秒以内的关键调整

你的代码存在几个核心性能瓶颈和逻辑冗余点,以下是针对性的优化措施:

1. 最优先级:把brick_keys转为集合

列表的in操作是O(n)时间复杂度,集合是O(1)。如果brick_keys规模较大,这一步能直接砍掉大量重复遍历的耗时:

brick_keys_set = set(brick_keys)

2. 重构逻辑:一次遍历完成校验+统计

原代码边遍历边判断,中途维护counter的逻辑冗余且容易出错。改成先完整校验当前建筑的所有砖块需求,再决定执行建造还是统计缺失,减少分支判断的CPU开销。

3. 缓存重复访问的变量

提前把instructions[i]存为局部变量,避免多次字典索引的重复开销;直接遍历字典的items()方法,减少键值对的重复查找。

4. 修复not_built计数错误

原代码每遇到一个不满足的砖块就not_built +=1,会导致同一个建筑被多次计数。调整为:整个建筑无法建造时,仅计数一次。

5. 去掉不必要的冗余操作

  • 删掉无意义的f"{j}"字符串格式化(j本身就是字典键,直接用即可);
  • 仅在确认能建造时才收集需要扣减的砖块,避免不必要的临时字典更新。

优化后的完整代码(保留原统计逻辑)

# 提前转集合,仅执行一次
brick_keys_set = set(brick_keys)

for building_id in jerz_buildings:
    building_req = instructions[building_id]
    can_build = True
    existing_missing = 0  # 对应原代码的missing_bricks:已有砖块的缺失量
    new_missing = 0       # 对应原代码的missing:无该类型砖块的缺失量
    required_bricks = []  # 存储可建造时需要扣减的砖块和数量

    # 一次遍历完成校验与缺失统计
    for brick, req_qty in building_req.items():
        if brick in brick_keys_set:
            stock_qty = bricks[brick]
            if req_qty > stock_qty:
                can_build = False
                existing_missing += req_qty - stock_qty
            else:
                required_bricks.append( (brick, req_qty) )
        else:
            can_build = False
            new_missing += req_qty

    # 根据校验结果执行操作
    if can_build:
        built += 1
        for brick, qty in required_bricks:
            bricks[brick] -= qty
            bricks_for_first_stage += qty
    else:
        not_built += 1
        missing_bricks += existing_missing
        missing += new_missing

这些调整的核心是把高复杂度的操作降为常数级,去掉冗余的分支和内存操作,同时修复逻辑错误带来的无效计算,足以把耗时压到30秒以内。

内容的提问来源于stack exchange,提问作者AnderAmur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:10:35