
本文针对在大量素数中寻找满足特定条件的组合这一计算密集型问题,提供了一种基于Numba的优化方案。通过预计算有效的素数对组合,并利用Numba的即时编译和并行计算能力,显著提升搜索效率,从而在合理时间内找到符合要求的最小素数组合。文章详细介绍了算法实现和代码示例,帮助读者理解并应用Numba加速Python代码。
在处理大规模数据时,Python的执行效率往往成为瓶颈。对于诸如在大量素数中寻找特定组合的问题,如果使用纯Python实现,计算时间可能会非常长。本文将介绍如何使用Numba库来优化这类问题,并通过一个具体的例子——寻找满足特定条件的最小素数组合——来展示Numba的强大功能。
Numba是一个开源的Python编译器,它可以将Python代码编译成机器码,从而显著提高程序的运行速度。Numba特别适合于数值计算密集型的任务,例如循环、数学运算等。它通过即时编译(Just-In-Time, JIT)技术,在运行时将Python代码编译成机器码,避免了解释执行的开销。
我们需要在一定范围内的素数中,找到一个包含5个素数的集合,满足以下条件:
立即学习“Python免费学习笔记(深入)”;
直接搜索所有可能的素数组合效率极低。为了提高效率,可以采用以下策略:
以下是使用Numba优化素数组合查找的示例代码:
import numpy as np
from numba import njit, prange
@njit
def is_prime(a):
    """判断一个数是否为素数"""
    if a < 2:
        return False
    for x in range(2, int(a**0.5) + 1):
        if a % x == 0:
            return False
    return True
@njit
def str_to_int(s):
    """将字符串转换为整数"""
    final_index, result = len(s) - 1, 0
    for i, v in enumerate(s):
        result += (ord(v) - 48) * (10 ** (final_index - i))
    return result
@njit
def generate_primes(n):
    """生成小于n的所有素数"""
    out = []
    for i in range(3, n + 1):
        if is_prime(i):
            out.append(i)
    return out
@njit(parallel=True)
def get_comb(n=100_000):
    """寻找满足条件的最小素数组合"""
    # 生成所有小于n的素数
    primes = generate_primes(n)
    n_primes = len(primes)
    # 生成所有有效的素数组合
    combs = np.zeros((n_primes, n_primes), dtype=np.uint8)
    for i in prange(n_primes):
        for j in prange(i + 1, n_primes):
            p1, p2 = primes[i], primes[j]
            c1 = str_to_int(f"{p1}{p2}")
            c2 = str_to_int(f"{p2}{p1}")
            if not is_prime(c1) or not is_prime(c2):
                continue
            combs[i, j] = 1
    all_combs = []
    for i_p1 in prange(0, n_primes):
        for i_p2 in prange(i_p1 + 1, n_primes):
            if combs[i_p1, i_p2] == 0:
                continue
            for i_p3 in prange(i_p2 + 1, n_primes):
                if combs[i_p1, i_p3] == 0:
                    continue
                if combs[i_p2, i_p3] == 0:
                    continue
                for i_p4 in prange(i_p3 + 1, n_primes):
                    if combs[i_p1, i_p4] == 0:
                        continue
                    if combs[i_p2, i_p4] == 0:
                        continue
                    if combs[i_p3, i_p4] == 0:
                        continue
                    for i_p5 in prange(i_p4 + 1, n_primes):
                        if combs[i_p1, i_p5] == 0:
                            continue
                        if combs[i_p2, i_p5] == 0:
                            continue
                        if combs[i_p3, i_p5] == 0:
                            continue
                        if combs[i_p4, i_p5] == 0:
                            continue
                        p1, p2, p3, p4, p5 = (
                            primes[i_p1],
                            primes[i_p2],
                            primes[i_p3],
                            primes[i_p4],
                            primes[i_p5],
                        )
                        ccomb = np.array([p1, p2, p3, p4, p5], dtype=np.int64)
                        if np.sum(ccomb) < n:
                            continue
                        all_combs.append(ccomb)
                        print(ccomb) #输出符合要求的组合,方便调试
                        break # 找到一个组合就跳出,因为要找最小和
    return all_combs
all_combs = np.array(get_comb())
print()
print("Minimal combination:")
print(all_combs[np.sum(all_combs, axis=1).argmin()])代码解释:
注意事项:
通过使用Numba,我们可以显著提高Python代码的运行速度,特别是在处理数值计算密集型的任务时。本例展示了如何使用Numba加速素数组合查找,通过预计算和并行计算,可以在合理的时间内找到满足特定条件的最小素数组合。这种优化方法可以应用于其他类似的问题,例如密码学、数据挖掘等领域。
以上就是Python嵌套列表搜索优化:利用Numba加速素数组合查找的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号