跳转到主要内容

Unicode(以及其他整数)表打包器

项目描述

packTab

我在2001年首次编写了类似的东西,当时我在FriBidi中需要它。

https://github.com/fribidi/fribidi/blob/master/gen.tab/packtab.c

2019年,我想用它来为HarfBuzz生成更紧凑的Unicode数据表,但为了方便,我想从Python中使用它。虽然我考虑将C代码封装在一个模块中,但我突然想到,我可以以更干净的方式用纯Python重写它。那代码在我的简历上留下了污点(在可读性方面!):D

这个Python版本建立在相同的思想上,但在两个主要方面与C版本不同

  1. 与C版本使用回溯来寻找最佳分割机会相比,我发现这可以通过动态规划来实现。因此,Python版本实现了DP方法,这要快得多。

  2. C版本不尝试将多个项目打包到单个字节中。Python版本这样做。也就是说,如果项目适合,它们可能会打包到1、2或4位每项。

还有其他许多优化,使得(最终,当完成时)Python版本更通用,可用于更广泛的数据表。

待办事项

  • 减少Inner/Outer genCode()之间的代码重复。
  • 处理空数据数组。
  • 如果这样做不会扩大数据类型,将宽度乘数嵌入到数组数据中。这又会节省操作。
  • 如果数组的大小不超过64位,则直接将其内联到代码中作为单个整数。
  • 目前我们只在最后删除默认值数组。在开始时也这样做,并调整分割代码以找到最佳位移。
  • 字节重用!这是一个更大的工作项目。

支持