有没有办法使用pypy只编译一个函数而非整个Python程序?
我已知的瓶颈是我花费99%的CPU时间(主要包括整数移位和异或),并已经在Python中进行了尽可能多的优化。除非绝对必要,否则我不想编写和维护C库。
现在我正在使用Anaconda Python,它是正常的Python加上一堆库。我会使用pypy,只是我不想确保所有其他部分的程序都可以与pypy正常工作。
是否有一种方法可以显式地仅在一个Python函数上运行JIT?
我已知的瓶颈是我花费99%的CPU时间(主要包括整数移位和异或),并已经在Python中进行了尽可能多的优化。除非绝对必要,否则我不想编写和维护C库。
现在我正在使用Anaconda Python,它是正常的Python加上一堆库。我会使用pypy,只是我不想确保所有其他部分的程序都可以与pypy正常工作。
是否有一种方法可以显式地仅在一个Python函数上运行JIT?
编辑:该函数是GF2(伽罗瓦域)中的模乘步骤。
具体来说:
def _gf2mulmod(x,y,m):
z = 0
while x > 0:
if (x & 1) != 0:
z ^= y
y <<= 1
y2 = y ^ m
if y2 < y:
y = y2
x >>= 1
return z
它需要支持大整数,所以我不确定如何重写以使其兼容Cython。
我刚尝试使用numba的@autojit,但它失败了,因为它不知道要使用什么变量类型,并假设是小整数。我似乎无法弄清楚如何告诉它使用标准Python大整数。
Traceback (most recent call last):
File "/Users/jason_s/Documents/python/libgf2/src/libgf2/gf2.py", line 440, in <module>
dlog43 = GF2DiscreteLog(0x100000000065)
File "/Users/jason_s/Documents/python/libgf2/src/libgf2/gf2.py", line 295, in __init__
factors = _calculateFactors(poly)
File "/Users/jason_s/Documents/python/libgf2/src/libgf2/gf2.py", line 264, in _calculateFactors
if (e1 << m).value != 1:
File "/Users/jason_s/Documents/python/libgf2/src/libgf2/gf2.py", line 379, in __lshift__
return self._wrapraw(_gf2lshiftmod(self.value,k,self.poly))
File "/Users/jason_s/Documents/python/libgf2/src/libgf2/gf2.py", line 195, in _gf2lshiftmod
return _gf2mulmod(x,_gf2powmod(2,k,m),m)
File "/Users/jason_s/Documents/python/libgf2/src/libgf2/gf2.py", line 189, in _gf2powmod
z = _gf2mulmod(z,x,m)
File "numbawrapper.pyx", line 193, in numba.numbawrapper._NumbaSpecializingWrapper.__call__ (numba/numbawrapper.c:3764)
OverflowError: value too large to convert to signed int
numba
可能会有帮助?http://numba.pydata.org/ - kindall