如何加速按行及行内元素执行的Python循环?
快速优化Pandas逐行权重计算的方案
这问题我太熟了!Pandas里用Python循环逐行处理大数据真的会慢到让人抓狂,咱们直接用向量化操作来解决,分分钟提速几十上百倍~
为什么你的原代码慢?
你原来的循环是在Python层面逐行调用iloc处理,每一次循环都要做索引查找和Python层面的计算,完全没用到Pandas/numpy底层的C语言优化,数据量一大(比如几万行)就会特别卡。
两种高效优化方案
方案一:用Pandas原生div方法(推荐,最简洁)
直接利用Pandas的对齐机制,一行代码搞定:
port1 = ndate.div(portT, axis=0)
原理:portT是和ndate行数一致的Series,指定axis=0后,Pandas会自动将ndate的每一行所有列元素,除以该行对应的portT值,全程都是底层向量化计算,没有Python循环开销。
方案二:利用numpy广播(适合索引不匹配的场景)
如果ndate和portT的索引没法对齐,也可以用numpy的广播机制:
# 把portT转成N行1列的二维数组,让numpy自动广播到和ndate同形状 port1 = ndate / portT.values.reshape(-1, 1)
原理:numpy的广播会自动将一维的portT扩展成和ndate行数相同、列数为1的二维数组,然后逐元素完成除法,同样是底层优化的高速计算。
验证效果
这两种方法得到的结果和你原来的循环完全一致,但速度差距巨大——比如当ndate有10万行时,向量化操作的速度会比循环快几百倍,亲测有效!
内容的提问来源于stack exchange,提问作者Ekaterina
相关产品推荐
相关产品推荐

