有没有办法加速Python长整数的按位操作?

4
我正在使用Python编写一个国际象棋程序,并使用python-chess进行棋盘表示和移动生成等操作。它通常非常好,并且具有非常有用的功能。
然而,由于它是纯Python编写的,它现在成为了我的AI的瓶颈。模块中广泛使用了Python长整型及其位运算。
x = b & -b
b ^= x

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

有没有其他模块可以加速Python中这种操作?是否可以在不重写为C或Fortran的情况下实现?我尝试使用numba包,但似乎无法编译Python长整型。非常感谢。

你看过Cython、NumPy F2PY等吗? - Padraic Cunningham
2
你不需要写C语言来使用Cython,这正是它的优点,它为你完成所有的工作。 - Padraic Cunningham
2
使用PyPy。或者,如果可能的话,使用Numpy。 - Veedrac
@Veedrac,我之前尝试过numpy,但速度并没有更快。Numpy适用于数组操作,而这里的棋盘是用一个长整型表示的。 - jf328
1
正如OP在问题中所述,实现方式是模块的方式,而不是OP的代码。作为python-chess的作者。 - SethMMorton
显示剩余7条评论
2个回答

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 的 long 类型几乎完全相同,因此它应该是一个直接替换。 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 类型的所有性能优势,您可能需要修改您的逻辑和/或代码。

有趣的是,Python-chess的作者在文档中确切地说了这句话。 - jf328

1

1
在CPython上它的速度慢了5倍。 - Veedrac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接