日记 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有机会被消去.