日记 2019-11-06
杂谈¶
签证的事情要收尾了…
然后今天神医说他回去当研究生了, bandwidth够了想来做点好玩的项目.
我立即给他讲了Restrain JIT的实现, 不愧是在Python技能上相当全面的选手, 很快就摸清楚了原理, 接下来希望他能好好实现闭包的JIT诶嘿.
闭包的JIT其实还是有一点挤牙膏式的性能问题的.
- Python的自由变量很多时候是只读的, 存储的时候, 完全可以做成type stable的. 但是因为是Cython后端, 又没有generic type(specifically, intensional type analysis), 相应的优化暂时没办法实现. 具体的问题示例, 就是 - def add(x): def addx(y): return x + y return addx - 的时候, 当 - add还未JIT过, 其返回的闭包- addx存储自由变量- x还是当作- object类型在存. 即使之后- add触发JIT, 已经返回的- addx还是慢的版本.
- 即使自由变量是会被写的, 可能也是type stable的. 这个优化需要一定完成度的type infer, 暂时不考虑. 
对于第一点我有点想法, 那就是咱们也在Python里造一套intensional type analysis, 提供runtime type representation.
闭包变量会使用 Cell 数据结构去表示
cdef class Cell:
    cdef object cell_contents
为了避免 cell_contents 是 object , 可以在构造的时候判断类型,
弄出 Cell[int] , Cell[MyJITableType] 这样的类型.
PS: 如果真搞出这一套东西, 那么就会有 JITList[T] vs. list 了.
PPS: 想了一下, 我觉得真行. 求python type在Cython端是0开销, 总开销大头是从 1 构造 Cell[Int](1) 的一个dispatch, JIT之后这dispatch有机会被消去.