使用 numba 进行质数分解
Prime number factorization with numba
我正在尝试使用 numba 制作一个素数分解算法,但我得不到令人满意的结果。
这是我的代码:
from timeit import default_timer as timer
from numba import jit
def DumbPrimeFactors(n):
result_list = list()
prime = 2
remaining = n
while remaining > 1:
if remaining % prime == 0:
result_list.append(prime)
remaining /= prime
prime -= 1
prime +=1
return result_list
start = timer()
print(DumbPrimeFactors(500000000008))
print(f"time: {timer() - start}")
start = timer()
SmartPrimeFactors = jit(DumbPrimeFactors)
print(SmartPrimeFactors(500000000008))
print(f"time: {timer() - start}")
当我执行它时,numba 函数似乎变慢了,所以我猜它没有按照预期的方式工作。
如果你 运行 jit(DumbPrimeFactors, nopython=True)
,你会看到一个错误,显示 numba 正在 object
模式下运行该函数,因为它不知道如何将所有内容转换为机器代码,这不会给你最佳的性能。解决方法是更改行:
result_list = list()
至:
result_list = []
似乎将 python 转换为 IR(中间表示)的 numba 代码不知道 list()
语法。然后在我的机器上,numba jitted 版本比 un-jitted 版本快大约 7 倍。还要注意,当你对 numba 代码计时时,你第一次 运行 它,你看到的时间是 运行 时间 + 编译时间。所有后续 运行 都将使用缓存版本的 jitted 代码,因此您只会看到实际执行时间。
我正在尝试使用 numba 制作一个素数分解算法,但我得不到令人满意的结果。
这是我的代码:
from timeit import default_timer as timer
from numba import jit
def DumbPrimeFactors(n):
result_list = list()
prime = 2
remaining = n
while remaining > 1:
if remaining % prime == 0:
result_list.append(prime)
remaining /= prime
prime -= 1
prime +=1
return result_list
start = timer()
print(DumbPrimeFactors(500000000008))
print(f"time: {timer() - start}")
start = timer()
SmartPrimeFactors = jit(DumbPrimeFactors)
print(SmartPrimeFactors(500000000008))
print(f"time: {timer() - start}")
当我执行它时,numba 函数似乎变慢了,所以我猜它没有按照预期的方式工作。
如果你 运行 jit(DumbPrimeFactors, nopython=True)
,你会看到一个错误,显示 numba 正在 object
模式下运行该函数,因为它不知道如何将所有内容转换为机器代码,这不会给你最佳的性能。解决方法是更改行:
result_list = list()
至:
result_list = []
似乎将 python 转换为 IR(中间表示)的 numba 代码不知道 list()
语法。然后在我的机器上,numba jitted 版本比 un-jitted 版本快大约 7 倍。还要注意,当你对 numba 代码计时时,你第一次 运行 它,你看到的时间是 运行 时间 + 编译时间。所有后续 运行 都将使用缓存版本的 jitted 代码,因此您只会看到实际执行时间。