Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Python嵌套列表搜索优化:寻找满足特定条件的素数组合_创想鸟

Python嵌套列表搜索优化:寻找满足特定条件的素数组合

python嵌套列表搜索优化:寻找满足特定条件的素数组合

本文旨在提供一种优化Python代码,以解决在素数列表中搜索满足特定条件的素数组合的问题。通过使用Numba库进行即时编译,并结合并行计算,可以显著提高搜索效率。本文将详细介绍如何使用Numba优化代码,并提供完整的示例代码。

问题描述

我们需要在一个包含2到10万的素数列表中,找到满足以下条件的第一个包含5个素数的集合:

p1 该集合中任意两个素数组合(例如,3和7 => 37和73)也必须是素数sum(p1..p5) 是满足上述条件的素数和的最小值,且大于10万

原始代码在解决这个问题时速度非常慢,因此需要进行优化。

优化方案:使用Numba

Numba是一个Python的即时(JIT)编译器,它可以将Python代码转换为机器码,从而显著提高代码的执行速度。Numba尤其适用于数值计算密集型的代码,例如本例中的素数搜索。

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

1. 安装Numba

首先,确保已经安装了Numba。可以使用pip进行安装:

pip install numba

2. 代码优化步骤

以下是使用Numba优化代码的步骤:

a. 导入必要的库

import numpy as npfrom numba import njit, prange

numpy 用于数组操作。numba.njit 用于将Python函数编译为机器码。numba.prange 用于并行循环。

b. 定义素数判断函数

@njitdef 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装饰器告诉Numba编译此函数。

c. 定义字符串转整数函数

@njitdef 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

此函数用于将两个素数连接成一个整数,例如将3和7连接成37。

d. 生成素数列表

@njitdef generate_primes(n):    out = []    for i in range(3, n + 1):        if prime(i):            out.append(i)    return out

生成小于n的所有素数。

e. 生成有效的素数组合

@njit(parallel=True)def get_comb(n=100_000):    # generate all primes < n    primes = generate_primes(n)    n_primes = len(primes)    # generate all valid combinations of 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 prime(c1) or not 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

@njit(parallel=True) 启用并行计算。prange 用于并行循环,可以显著提高计算速度。首先,生成所有素数小于n的列表。然后,生成所有有效的素数组合,存储在combs数组中。最后,遍历所有可能的素数组合,找到满足条件的第一个组合。

f. 找到最小的素数组合

all_combs = np.array(get_comb())print()print("Minimal combination:")print(all_combs[np.sum(all_combs, axis=1).argmin()])

计算所有素数组合的和,并找到最小的和对应的组合。

3. 完整代码

import numpy as npfrom numba import njit, prange@njitdef 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@njitdef 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@njitdef generate_primes(n):    out = []    for i in range(3, n + 1):        if prime(i):            out.append(i)    return out@njit(parallel=True)def get_comb(n=100_000):    # generate all primes < n    primes = generate_primes(n)    n_primes = len(primes)    # generate all valid combinations of 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 prime(c1) or not 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_combsall_combs = np.array(get_comb())print()print("Minimal combination:")print(all_combs[np.sum(all_combs, axis=1).argmin()])

4. 运行结果

在AMD 5700X CPU上,该代码可以在1分20秒内完成计算。

[    3 28277 44111 70241 78509][    7    61 25939 26893 63601][    7    61 25939 61417 63601]                     [    7    61 25939 61471 86959]                     [    7  2467 24847 55213 92593]                     [    7  3361 30757 49069 57331]                ...[ 1993 12823 35911 69691 87697][ 2287  4483  6793 27823 67723][ 3541  9187 38167 44257 65677]Minimal combination:                                [   13   829  9091 17929 72739]real    1m20,599s                                   user    0m0,011s                                    sys     0m0,008s                                    

注意事项

Numba在第一次运行时需要编译代码,因此第一次运行可能会比较慢。Numba对某些Python特性支持有限,需要注意代码的兼容性。并行计算可以提高计算速度,但也会增加CPU的负载。

总结

通过使用Numba进行即时编译和并行计算,可以显著提高Python代码的执行速度,特别是在数值计算密集型的任务中。本文提供了一个具体的例子,展示了如何使用Numba优化素数搜索问题,并提供了完整的示例代码。希望本文能帮助读者更好地理解和应用Numba。

以上就是Python嵌套列表搜索优化:寻找满足特定条件的素数组合的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1370658.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用 Turtle 模块绘制网格:深入理解坐标系统和循环控制
上一篇 2025年12月14日 10:44:07
Python中利用循环进行批量统计比较:以Wilcoxon符号秩检验为例
下一篇 2025年12月14日 10:44:14

相关推荐

  • Spring Boot集成MongoDB Atlas:正确配置与故障排除

    本教程详细指导如何在Spring Boot应用中正确配置与连接MongoDB Atlas集群。我们将重点讲解如何获取并使用正确的Atlas连接URI,安全地处理用户认证信息,以及准确指定目标数据库。通过实例代码和常见错误排查,帮助开发者避免连接失败,确保应用与MongoDB Atlas的顺畅集成。 …

    2026年9月22日
    600
  • MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能

    MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能MySQL在Sublime中高亮配置指南_实现关键词提示与语法检查功能

    要配置sublime text以更好地处理mysql代码,需安装package control、sql语法包(如sqltools或sublimesql)、sublimelinter及sqlfluff进行语法检查,并可选装格式化与数据库连接插件。1. 安装package control是前提;2. 通…

    2026年9月22日 • 用户投稿
    400
  • Hazelcast缓存数据添加后无法在Map中显示问题排查与解决

    本文旨在解决在使用Spring Cache注解(如 @CachePut)向Hazelcast缓存添加数据后,无法直接通过 HazelcastInstance 获取对应Map并查看数据的问题。文章将详细介绍问题可能的原因,并提供相应的解决方案,包括启用缓存、配置 CacheManager 以及使用 J…

    2026年9月22日
    200
  • 瑞达写作官方网站登录端 瑞达写作App官方使用入口

    瑞达写作官方登录入口为https://ipapers.net,该平台支持论文初稿快速生成、多学科适配、智能修改及问卷报告自动化,集成国标引文与权威数据源,提供图表、代码等多元内容生成服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 瑞达…

    2026年9月22日
    000
  • Symfony 测试中设置请求内容:模拟 API 用户注册

    在 Symfony 单元测试中模拟 API 请求,特别是针对用户注册场景,重点讲解如何设置包含特定 Header(如 x-auth-token)以及 Form-Data 格式的请求体,并提供示例代码和注意事项,帮助开发者编写更可靠的 API 测试。 在 Symfony 中进行单元测试时,经常需要模拟…

    2026年9月22日
    000
  • 谷歌浏览器怎么解决CPU占用率100%的问题_Chrome高CPU占用率原因排查与优化技巧

    1、检查并管理扩展程序,逐一禁用排查高耗能插件;2、清除所有时间范围的浏览数据与缓存;3、关闭硬件加速功能以排除GPU兼容性问题;4、终止Software Reporter Tool进程并禁用其权限;5、重置chrome://flags中GPU相关实验性设置为默认状态,逐步优化CPU占用过高的问题。…

    2026年9月22日
    000
  • VSCode连接Modelsim仿真工具(调试技巧分享,波形分析指南)

    首先确保Modelsim路径加入系统PATH,安装VSCode的HDL扩展,配置tasks.json定义编译、仿真任务,并编写Tcl脚本自动化add wave、run等操作,通过问题匹配器解析错误,利用Tcl实现参数化仿真与自动化测试,结合Makefile或脚本提升大型项目管理效率。 将VSCode…

    2026年9月22日
    400
  • Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围

    Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围

    在sublime中实现数据权限控制模块的核心在于根据用户角色动态拼接sql语句,具体步骤如下:1. 建立角色表、用户表和权限规则表,明确角色与数据的对应关系;2. 用户登录后获取其角色id,并查询该角色可访问的数据范围;3. 根据权限动态构建sql查询条件,限制访问范围;4. 使用python等语言…

    2026年9月22日 • 用户投稿
    200
  • python 基准测试(cProfile kcachegrind line_profiler memory_profiler)

    learn from 《python高性能(第2版)》 类似工具:pycharm profile对函数调用效率进行测试 1. 例子 一个圆周运动的动画 代码语言:javascript代码运行次数:0运行复制 from matplotlib import pyplot as pltfrom matpl…

    2026年9月22日
    200
  • 手机淘宝主页怎么找?手机淘宝主页怎么找客服

    打开淘宝App后点击右下角“我的淘宝”进入个人主页;2. 点击头像可进入逛逛主页;3. 首页搜索“联系客服”可直达客服中心;4. 订单详情页可联系卖家或申请平台帮助。 如果您在使用手机淘宝时找不到个人主页或需要联系客服,可能是由于界面布局不熟悉或入口隐藏较深。以下是查找主页和联系客服的具体步骤: 本…

    2026年9月22日
    300
  • 神马搜索App用户反馈处理教程_神马搜索App问题解决技巧

    首先通过App内“帮助与反馈”提交问题,其次针对负面信息访问官网进行侵权投诉,最后定期清理缓存以解决卡顿或显示异常问题。 如果您在使用神马搜索App时遇到问题或希望反馈体验,可以通过官方渠道提交信息以获得处理。以下是针对不同问题的解决步骤: 本文运行环境:iPhone 15 Pro,iOS 18 一…

    2026年9月22日
    000
  • 如何判断网络延迟(Ping值)过高是由运营商问题还是自身设备引起的?

    先重启设备并检查本地连接,若有线网络延迟降低则问题在无线信号;通过ping网关和外部DNS判断故障范围,结合tracert追踪路径,前几跳异常指向运营商问题,最后用官方测速工具验证并联系客服解决。 判断网络延迟高是运营商还是自身设备的问题,关键在于逐步隔离排查。从最接近你的设备开始测试,向外层层推进…

    2026年9月22日
    200
  • 使用MockWebServer对FeignClient进行单元测试

    本文详细阐述了如何利用Spring Cloud LoadBalancer和MockWebServer对FeignClient进行高效单元测试。通过在测试配置中动态注册MockWebServer实例,并将其作为FeignClient的服务发现目标,开发者可以精确模拟后端API的行为,包括各种HTTP响…

    2026年9月22日
    100
  • 豫事办的密码怎么改

    首先通过个人中心修改密码或使用忘记密码功能重置。记得密码时,进入豫事办APP我的→设置→修改密码,输入原密码和新密码即可;忘记密码则在登录页点击“忘记密码”,输入手机号获取验证码后设置新密码完成重置。 如果您需要更新您的豫事办账户密码以确保账户安全,可以通过应用内设置直接修改,或在忘记密码时通过身份…

    2026年9月22日
    400
  • VSCode安全更新机制解析

    VSCode通过自动检查、数字签名验证和用户可控策略确保更新安全。启动时后台定期HTTPS请求检查新版本,每日一次;安装包经平台特定签名(Windows Authenticode、macOS代码签名、Linux GPG)验证完整性;用户可选自动更新、提示或关闭,企业可集中管控;微软通过安全入口响应漏…

    2026年9月22日
    200
  • Hazelcast缓存数据未显示:排查与解决指南

    本文旨在解决在使用Spring Cache结合Hazelcast时,通过@CachePut等注解成功将数据放入缓存,但无法通过HazelcastInstance获取缓存数据的问题。文章将深入探讨可能的原因,并提供详细的配置步骤和代码示例,帮助开发者正确配置和使用Hazelcast缓存。 在使用Spr…

    2026年9月22日
    000
  • Laravel 8 登录后重定向至仪表盘的策略与实践

    本教程详细阐述了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种策略。我们将探讨如何通过配置 LoginController 的 $redirectTo 属性、利用 RouteServiceProvider 定义常量以及在自定义登录方法中进行精确控制来管理重定向流程。文章还涵盖了相关中间…

    2026年9月22日
    100
  • Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析

    Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析Sublime支持MySQL触发日志写入模块_便于数据变更监控与溯源分析

    sublime可通过插件实现与mysql联动监控触发器日志写入。具体步骤如下:1.安装package control、mysql语法高亮、构建系统等插件;2.创建日志表并编写触发器记录数据变更;3.配置.sublime-build文件调用mysql命令行执行sql脚本;4.使用快捷键提升日志查询和处…

    2026年9月22日 • 用户投稿
    100
  • E票电影app微信解绑教程

    E票电影app微信解绑操作指南: 1、启动应用后,选择底部菜单中的“我的”页面,接着点击“设置”图标。 2、在设置界面中,找到并进入“账户与安全”功能项。 3、进入绑定信息页面后,点击“已绑定”的微信账号,按照提示完成解绑操作。 以上就是E票电影app微信解绑教程的详细内容,更多请关注创想鸟其它相关…

    2026年9月22日
    100
  • 成都一青旅禁止40岁以上男性预订?店家回应

    近日,四川成都的一家青年旅舍因其一项特殊的预订规则而引发了网络热议。有网友发现,该青旅推出的4元特价房,竟明确禁止40岁以上的男性和30岁以上的女性进行预订。 特价房背后的“附加任务” 10月13日,记者联系了涉事的三家青旅。工作人员向记者证实了这一年龄限制的存在。他们解释称,这4元的特价并非简单的…

    用户投稿 2026年9月22日
    000

发表回复

登录后才能评论
关注微信