返回第九十章 七千万次的小石头  这个学霸疑似巨额知识来源不明首页

关灯 护眼     字体:

上一页 目录 下一章

直接替换到Python 审计主流程里去。

    作为在废土里见识过一个小数点错误导致整个证明功亏一篑的幸存者,他对替换底层逻辑有着病态的严谨。

    他先做Baseline。

    原流程输出什么,新函数就必须输出一模一样的东西。

    在量化金融的数据里,现实永远比理论肮脏。

    无重复值(理想状态)。

    重复值(两只股票因子得分完全一样)。

    缺失值(NaN,某只股票当天停牌没有数据)。

    极端值(Infinity)。

    负值。

    相等值且需要保持原相对顺序(稳定排序要求)。

    每一种情况,都必须对齐。

    有重复值时,原来在数组里谁在前面,现在排序后也必须谁在前面。

    遇到NaN缺失值时,量化的规则不是数学上的把它当最大或者把它当最小,而是必须按照项

    这并非纯粹数学定义上的排序,带着强烈业务属性的金融审计项目里的排名规则。

    两者绝不能混为一谈。

    凌晨两点半,江临揉了揉发酸的眼睛。

    第一版v0跑过了包含两万个边缘测试用例的单元测试。

    结果全对。

    第一版只是为了验证这个强耦合的方向是走得通的。

    江临并不意外。

    他重新打开C 代码。

    开始真正的榨干性能。

    删掉所有不必要的状态判断。

    把仅有的一点循环彻底展开,变成直线型的直线代码。

    把可能会出现的各种数据类型的可能性彻底焊死,限定在这个项目里真正会输入进来的内存布局。

    凌晨三点十八,第二版出来了。

    他没有把这个函数暴露成一个给Python循环逐次调用的小玩具。

    那样七千万次跨语言调用本身就会成为新的灾难。

    他真正写的是一个批处理入口。

    一次性接收连续内存里的数百万个五元组,在C层内部跑完整个固定排序网络,再把排名矩阵吐回给Python。

    再次跑测试。

    结果一致。

    但这还不够。

    江临的眉头微微皱起,他感觉到代码里还有多馀的脂肪。

    从抽屉里拿出一张白纸和一支笔。

    纸上,他画了五个圆圈,标上序号:0,1,2,3,4。

    然后开始在圆圈之间连接数。

    他现在写的不是代码,而是动作。

    在底层的汇编指令里,比较并交换是一个极其廉价的动作。

    只要没有if分支造成的预测失败,指令就可以象水一样顺畅地通过 CPU流水线。

    比较0和1(大的去右边)。

    比较3和4。

    比较2和4。

    比较2和3。

    比较1和4。

    比较0和3。

    ……

    每一步,都象是在进行一次精密的机械手工调整。

    五个数排好序,根本不需要程序在每一次运行的时候去思考接下来该怎么办。

    路线是可以提前定死的。

    就象水流经过预先挖好的迷宫沟渠,无论水势大小,最终都会从既定的出口按照大小顺序流出。

    这就是计算机科学中极其冷门但极其硬核的概念。

    排序网络。

    它一点也不聪明。

    面对1000个数它毫无办法。

    但它非常稳定。

    它不通用,但它是为高频,小规模任务量身定制的终极杀器。

    写到这里,江临停下了笔。

    忽然想起了上午在B304里,那个放在桌角的磁性几何魔方,想起了那道阿里数学竞赛的盲盒题。

    他记得自己对尹航说过的话,先别被图案牵着走,先找上界,再找取等构造。

    优化排序底层的逻辑也一样。

    先别被排序这个在教科书里被讲烂了的大词吓住。

    他现在要处理的,根本不是排序学,只是五个内存位置之间有限次比较交换组合的最小充分集。

    这是一个很小的世界。

    小到它的所有状态都可以被数学穷尽。

    小到它是可以被严格证明的。

    但它重要到,只要这个动作被重复七千万次,它就会变成拖垮庞大金融系统的结构性瓶颈。

    凌晨四点十分,窗外的天际已经隐隐有了一丝青灰色。

    江临敲下最后一组指令,第三版完成。

『加入书签,方便阅读』

上一页 目录 下一章