使用 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 代码,因此您只会看到实际执行时间。