Python批量资源计算逻辑与SQLAlchemy查询优化咨询
性能优化结论
你当前的性能瓶颈完全不是Python语言本身的限制,是早期ORM使用方式不合理导致的开销,你第二次更新的批量UPDATE写法已经走在了正确的优化方向上,还可以继续优化到秒级完成10万条数据处理。
可继续优化的方向
- 合并UPDATE语句,减少全表扫描次数
你当前的写法需要扫描6次全表完成更新,完全可以用数据库内置的LEAST函数把「加产量」和「超上限截断」逻辑合并,仅需1次全表扫描即可完成所有更新:
这种写法性能会比6条单独UPDATE提升3~5倍。from sqlalchemy import func, or_ session.query(VillageNew).filter( # 只更新至少有一类资源没满的行,减少无效更新行数 or_( VillageNew.wood_stock < VillageNew.max_storage, VillageNew.stone_stock < VillageNew.max_storage, VillageNew.iron_stock < VillageNew.max_storage ) ).update( { VillageNew.wood_stock: func.least(VillageNew.wood_stock + VillageNew.wood_production, VillageNew.max_storage), VillageNew.stone_stock: func.least(VillageNew.stone_stock + VillageNew.stone_production, VillageNew.max_storage), VillageNew.iron_stock: func.least(VillageNew.iron_stock + VillageNew.iron_production, VillageNew.max_storage) }, synchronize_session=False # 无需同步ORM会话对象状态,进一步提升批量更新速度 ) session.commit() - 修正前序版本的笔误bug
你第一次参考建议更新的代码里,石料和铁矿的增量错误加了木材产量village.wood_production,如果没有修正的话会导致业务逻辑错误。 - 可选数据库索引优化
如果你的村庄数据量后续持续增长,可以给wood_stock、stone_stock、iron_stock、max_storage建立联合索引,加快过滤未存满资源的行的速度。
性能提升原理说明
你最初版本耗时久的核心原因是:Python层循环10万次,每次都发起1次数据库查询+1次数据更新请求,大量的网络往返、ORM对象状态跟踪开销占据了99%的耗时。把计算逻辑直接推到数据库层执行批量操作后,完全规避了Python层循环处理数据的开销,就算是100万条数据也能在几秒内处理完成,远没有触及Python的性能瓶颈。
内容的提问来源于stack exchange,提问作者TheRealShadow
相关产品推荐
相关产品推荐

