第90章 七千万次的小石头(7 / 9)
缺失值(nan,某只股票当天停牌没有数据)。
极端值(infinity)。
负值。
相等值且需要保持原相对顺序(稳定排序要求)。
每一种情况,都必须对齐。
有重复值时,原来在数组里谁在前面,现在排序后也必须谁在前面。
遇到nan缺失值时,量化的规则不是数学上的把它当最大或者把它当最小,而是必须按照项目预设的规则,將其单独剔除並打上mask_nan標籤,剩下的数继续排。
这並非纯粹数学定义上的排序,带著强烈业务属性的金融审计项目里的排名规则。
两者绝不能混为一谈。
凌晨两点半,江临揉了揉发酸的眼睛。
第一版v0跑过了包含两万个边缘测试用例的单元测试。
结果全对。
速度有提升,但並不大,大概只快了15%。
第一版只是为了验证这个强耦合的方向是走得通的。
江临並不意外。
他重新打开c 代码。
开始真正的榨乾性能。
刪掉所有不必要的状態判断。
把仅有的一点循环彻底展开,变成直线型的直线代码。
把可能会出现的各种数据类型的可能性彻底焊死,限定在这个项目里真正会输入进来的內存布局。
凌晨三点十八,第二版出来了。
他没有把这个函数暴露成一个给python循环逐次调用的小玩具。
那样七千万次跨语言调用本身就会成为新的灾难。
他真正写的是一个批处理入口。
一次性接收连续內存里的数百万个五元组,在c层內部跑完整个固定排序网络,再把排名矩阵吐回给python。
再次跑测试。
结果一致。
速度提升到了30%。
但这还不够。
江临的眉头微微皱起,他感觉到代码里还有多余的脂肪。 ↑返回顶部↑
极端值(infinity)。
负值。
相等值且需要保持原相对顺序(稳定排序要求)。
每一种情况,都必须对齐。
有重复值时,原来在数组里谁在前面,现在排序后也必须谁在前面。
遇到nan缺失值时,量化的规则不是数学上的把它当最大或者把它当最小,而是必须按照项目预设的规则,將其单独剔除並打上mask_nan標籤,剩下的数继续排。
这並非纯粹数学定义上的排序,带著强烈业务属性的金融审计项目里的排名规则。
两者绝不能混为一谈。
凌晨两点半,江临揉了揉发酸的眼睛。
第一版v0跑过了包含两万个边缘测试用例的单元测试。
结果全对。
速度有提升,但並不大,大概只快了15%。
第一版只是为了验证这个强耦合的方向是走得通的。
江临並不意外。
他重新打开c 代码。
开始真正的榨乾性能。
刪掉所有不必要的状態判断。
把仅有的一点循环彻底展开,变成直线型的直线代码。
把可能会出现的各种数据类型的可能性彻底焊死,限定在这个项目里真正会输入进来的內存布局。
凌晨三点十八,第二版出来了。
他没有把这个函数暴露成一个给python循环逐次调用的小玩具。
那样七千万次跨语言调用本身就会成为新的灾难。
他真正写的是一个批处理入口。
一次性接收连续內存里的数百万个五元组,在c层內部跑完整个固定排序网络,再把排名矩阵吐回给python。
再次跑测试。
结果一致。
速度提升到了30%。
但这还不够。
江临的眉头微微皱起,他感觉到代码里还有多余的脂肪。 ↑返回顶部↑