十六进制字符串的快速汉明距离计算
hexhamming的Python项目详细描述
为什么还要建一个哈明距离图书馆?
有很多很棒的(python)库提供计算方法 各种编辑距离,包括汉明距离:距离,文本距离, 松鼠、水母等。
在这种情况下,我需要一个处理十六进制的hamming距离库 字符串(即pythonstr)并执行得非常快。 此外,我通常不关心大于256位的十六进制字符串。 长度约束与所有其他库不同,并使我 通过numba、numpy甚至 SSE/AVX。
最后,我想最小化依赖关系,这意味着您不需要安装 ^{TT3}$,^{TT6}$,^{TT7}$,^{TT8}$,^{TT9}$等。
最后,在玩了gmpy.popcount,numba.jit之后, pythran.run、numpy和AVX2,我决定写我想要的东西 在一个原始C++头中。注意:我开发的唯一C++特性是C++异常; 没有这个,这很容易成为c。 int*,因此探索用fortran重新编写它没有什么意义。矢量化 这些技术还增加了 向量寄存器和普通寄存器;同时,将十六进制字符串转换为 来自char*的向量寄存器可摄取浮点被证明具有非平凡的 头顶上。
安装
要安装,请确保您有python 2.7或3.4+。运行:
pip install hexhamming
或从源安装:
git clone https://github.com/mrecachinas/hexhamming cd hexhamming python setup.py install # or pip install .
如果你想为hexhamming做贡献,你应该安装dev 依赖关系:
pip install -r requirements-dev.txt
并确保测试通过:
pytest # or tox -e py27,...
示例
使用基础C++扩展,可以简单地运行:
>>> from hexhamming import hamming_distance >>> hamming_distance('deadbeef', '00000000') 24
使用基于查找的C++扩展,替换上述 hamming_distance和hamming_distance_lookup。
如果您的机器支持Intel SSE4/AVX2指令集, 将上面的hamming_distance替换为fast_hamming_distance。 注意:要使用fast_hamming_distance,十六进制字符串必须是64 字符或更少(即256位或更少)。
基准
下面是在我2016年初的1.2 GHz英特尔上使用pytest-benchmark的基准测试 M5 8 GB 1867 MHz LPDDR3 MacOS Mojave(10.14.3),带Python 2.7.15和 叮当-1000.11.45.5。