如何在不使用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
相关产品推荐
相关产品推荐

