0

0

Python嵌套列表搜索优化:利用Numba加速素数组合查找

碧海醫心

碧海醫心

发布时间:2025-09-09 17:40:02

|

200人浏览过

|

来源于php中文网

原创

python嵌套列表搜索优化:利用numba加速素数组合查找

本文针对在大量素数中寻找满足特定条件的组合这一计算密集型问题,提供了一种基于Numba的优化方案。通过预计算有效的素数对组合,并利用Numba的即时编译和并行计算能力,显著提升搜索效率,从而在合理时间内找到符合要求的最小素数组合。文章详细介绍了算法实现和代码示例,帮助读者理解并应用Numba加速Python代码。

在处理大规模数据时,Python的执行效率往往成为瓶颈。对于诸如在大量素数中寻找特定组合的问题,如果使用纯Python实现,计算时间可能会非常长。本文将介绍如何使用Numba库来优化这类问题,并通过一个具体的例子——寻找满足特定条件的最小素数组合——来展示Numba的强大功能。

Numba简介

Numba是一个开源的Python编译器,它可以将Python代码编译成机器码,从而显著提高程序的运行速度。Numba特别适合于数值计算密集型的任务,例如循环、数学运算等。它通过即时编译(Just-In-Time, JIT)技术,在运行时将Python代码编译成机器码,避免了解释执行的开销。

问题描述

我们需要在一定范围内的素数中,找到一个包含5个素数的集合,满足以下条件:

立即学习Python免费学习笔记(深入)”;

  1. 集合中的素数按升序排列:p1
  2. 集合中任意两个素数组合(如p1和p2,组合成p1p2和p2p1)也必须是素数。
  3. 集合中所有素数的和大于某个给定的阈值(例如100,000),并且是满足上述条件的最小和。

优化思路

直接搜索所有可能的素数组合效率极低。为了提高效率,可以采用以下策略:

MOKI
MOKI

MOKI是美图推出的一款AI短片创作工具,旨在通过AI技术自动生成分镜图并转为视频素材。

下载
  1. 预计算素数对组合: 首先,生成指定范围内的所有素数。然后,预先计算这些素数两两组合后是否仍然是素数。将结果存储在一个二维数组中,用于后续快速查找。
  2. 利用Numba加速: 使用Numba的@njit装饰器将计算密集型的函数编译成机器码。
  3. 并行计算: 使用Numba的prange函数实现并行循环,充分利用多核CPU的计算能力。

代码实现

以下是使用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()])

代码解释:

  1. is_prime(a): 判断一个数a是否为素数。
  2. str_to_int(s): 将字符串s转换为整数。用于将两个素数拼接成一个整数。
  3. generate_primes(n): 生成小于n的所有素数。
  4. get_comb(n): 核心函数,寻找满足条件的最小素数组合。
    • 首先,生成小于n的所有素数。
    • 然后,预计算所有有效的素数组合,存储在combs数组中。combs[i, j] = 1表示primes[i]和primes[j]可以组合成素数。
    • 最后,遍历所有可能的素数组合,找到满足条件的最小组合。

注意事项:

  • Numba的@njit装饰器只能用于纯Python代码,不能包含任何Python内置函数或第三方库的调用(除非Numba支持)。
  • Numba的prange函数只能用于循环,不能用于其他语句。
  • Numba的编译需要一定的时间,因此第一次运行可能会比较慢。但是,后续运行速度会非常快。

总结

通过使用Numba,我们可以显著提高Python代码的运行速度,特别是在处理数值计算密集型的任务时。本例展示了如何使用Numba加速素数组合查找,通过预计算和并行计算,可以在合理的时间内找到满足特定条件的最小素数组合。这种优化方法可以应用于其他类似的问题,例如密码学、数据挖掘等领域。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1498

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

623

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

612

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

587

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

170

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

83

2025.08.07

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号