有什么方法可以加速Python long int按位运算?

时间:2014-12-21 21:25:50

标签: python bit-manipulation

我正在用Python编写国际象棋程序,我使用python-chess进行电路板表示和移动生成等。它通常非常好,并且具有非常有用的功能。

然而,由于它是纯Python,它现在是我的AI的瓶颈。 Python长整数及其按位运算广泛用于模块中,例如

x = b & -b
b ^= x

if not x & 0xffffffff:
    x >>= 32
    r |= 32

有没有办法在Python中加速这种操作,可能还有其他一些模块?没有在C或Fortran中重写是否可能?我尝试了numba包,但它似乎无法编译python long int。

非常感谢。

2 个答案:

答案 0 :(得分:2)

我维护gmpy2库并且它支持通常比Python的本机整数更快的整数操作。

这是一个简单的例子:

In [3]: x=12345678901234567890
In [4]: %timeit y=x;y>>=32
10000000 loops, best of 3: 113 ns per loop
In [5]: x=gmpy2.mpz(x)
In [6]: %timeit y=x;y>>=32
10000000 loops, best of 3: 71.9 ns per loop

mpz类型与Python的行为几乎完全相同,因此它应该是直接替代。 gmpy2还支持名为xmpz的可变整数类型。它支持直接位操作,对于就地操作可能更快。

In [9]: x=gmpy2.xmpz(0)
In [10]: bin(x)
Out[10]: '0b0'
In [11]: x[4]=1
In [12]: bin(x)
Out[12]: '0b10000'

要使用xmpz类型的所有性能优势,您可能需要修改逻辑和/或代码。

答案 1 :(得分:1)

尝试使用此软件包:https://pypi.python.org/pypi/bitarray

它是C代码的Python接口,旨在加速逐位操作。