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

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

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

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

Numba简介

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

问题描述

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

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

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

优化思路

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

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

代码实现

以下是使用Numba优化素数组合查找的示例代码:

import numpy as npfrom numba import njit, prange@njitdef 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@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):    """生成小于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_combsall_combs = np.array(get_comb())print()print("Minimal combination:")print(all_combs[np.sum(all_combs, axis=1).argmin()])

代码解释:

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

注意事项:

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

总结

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

以上就是Python嵌套列表搜索优化:利用Numba加速素数组合查找的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 10:41:59
下一篇 2025年12月14日 10:42:11

相关推荐

  • Python 中使用循环进行统计比较的方法

    本文介绍了如何在 Python 中使用循环结构,高效地对多个向量进行统计比较,以避免冗余代码。通过将向量数据存储在列表中,并结合 scipy.stats.wilcoxon 函数,可以简洁地实现 Wilcoxon 符号秩检验等统计分析,极大地提高了代码的可维护性和可扩展性。 在数据分析和科学计算中,经…

    2025年12月14日
    000
  • 使用 Turtle 模块绘制网格:X、Y 轴的实现

    本文旨在指导读者使用 Python 的 Turtle 模块绘制网格,重点解决在循环中同时绘制 X 轴和 Y 轴方向上的正方形网格的问题。通过修改循环条件和调整 square() 函数的调用位置,可以实现更灵活的网格绘制,并避免常见的循环错误。本文将提供详细的代码示例和解释,帮助读者理解 Turtle…

    2025年12月14日
    000
  • 安装 Cloupy 到 macOS Conda 环境的详细教程

    本文档旨在指导 macOS 用户在 Conda 环境中成功安装 Cloupy 库。Cloupy 依赖于多个具有版本限制的 Python 包,直接安装可能导致依赖冲突。本教程将介绍如何通过 Conda Forge 安装 Cloupy,并推荐创建一个独立的 Conda 环境以避免潜在的依赖问题,确保 C…

    2025年12月14日
    000
  • # 安装 Cloupy 在 macOS Conda 环境中的教程

    本文档旨在指导用户如何在 macOS 系统中使用 Conda 环境成功安装 Cloupy 软件包。由于 Cloupy 依赖项版本限制较为严格,建议创建一个新的 Conda 环境进行安装,以避免潜在的冲突。本文将详细介绍创建新环境和使用 `conda-forge` 渠道安装 Cloupy 的步骤,并提…

    2025年12月14日
    000
  • 在macOS Conda环境中安装Cloupy:解决依赖构建错误的最佳实践

    在#%#$#%@%@%$#%$#%#%#$%@_140c++1f12feeb2c52dfbeb2da6066a73aOS的Conda环境中安装Cloupy库时,用户常因其依赖(特别是pyproj)的编译问题而遭遇pip install失败。本教程将指导您如何通过利用Conda-Forge这一强大社区…

    2025年12月14日
    000
  • 解决Python向Google表格写入数据时自动添加单引号的问题

    本文旨在解决使用Python gspread库向Google表格写入数据时,因默认行为导致数值和日期自动添加单引号并转换为字符串的问题。通过详细分析问题根源,本文将提供并解释如何使用value_input_option=”USER_ENTERED”参数,确保数据在写入Goog…

    2025年12月14日
    000
  • 将CSV数据写入Google Sheets时避免添加单引号

    本文旨在解决使用Python将CSV数据导入Google Sheets时,数值和日期类型数据前自动添加单引号的问题。通过修改gspread库中append_rows函数的参数,可以控制数据的输入方式,从而避免数据类型被错误地转换为字符串。本文将提供详细的步骤和示例代码,帮助开发者正确地将CSV数据写…

    2025年12月14日
    000
  • 在macOS Conda环境中安装Cloupy并解决Pyproj构建错误

    本文详细介绍了在macOS系统的Conda环境中安装Cloupy库时遇到的pyproj构建失败问题及其解决方案。核心建议是避免在Conda环境中混合使用pip安装带有复杂C/C++依赖的包,而是推荐通过conda-forge渠道进行安装,以确保依赖项的兼容性和稳定性,特别强调创建独立环境以避免潜在的…

    2025年12月14日
    000
  • 使用Selenium与CSS选择器:动态网页数据提取实战指南

    本教程旨在详细阐述如何利用Selenium WebDriver结合CSS选择器高效地从JavaScript驱动的动态网页中提取结构化数据。文章将涵盖Selenium环境配置、元素定位核心方法、动态内容加载(如“加载更多”按钮)的处理策略,并通过一个实际案例演示如何抓取产品标题、URL、图片URL、价…

    2025年12月14日
    000
  • 使用 Selenium 和 CSS 选择器高效抓取 Patagonia 产品数据

    本文旨在指导开发者使用 Selenium Webdriver 和 CSS 选择器从 Patagonia 网站抓取女性夹克的产品信息,包括标题、URL、图片 URL、价格、评分和评论数量。文章将提供代码示例,并着重讲解如何编写简洁高效的 CSS 选择器,以及如何处理动态加载内容和数据清洗,最终将抓取的…

    2025年12月14日
    000
  • 解决Python PyQt6 DLL加载失败问题的详细教程

    在Python PyQt6开发中,有时会遇到“DLL load failed while importing QtCore”这样的错误,这通常意味着PyQt6的一些动态链接库(DLL)未能正确加载。这个问题可能由多种原因引起,包括PyQt6模块之间的版本冲突、依赖项缺失或损坏,以及不正确的安装方式。…

    2025年12月14日
    000
  • 解决Python PyQt6 DLL加载失败问题:一步步教程

    在PyQt6开发过程中,开发者可能会遇到ImportError: DLL load failed while importing QtCore: 这样的错误,这通常意味着Python无法加载PyQt6的动态链接库(DLL)。导致此问题的原因有很多,例如模块冲突、安装不完整或环境配置错误。以下提供一种…

    2025年12月14日
    000
  • 解决Python PyQt6 DLL加载失败问题:一步步指南

    本文旨在帮助开发者解决在使用Python PyQt6库时遇到的“DLL load failed”错误。通过卸载所有相关的PyQt6模块并重新安装,可以有效地解决此问题。本文将提供详细的卸载和安装步骤,确保您能顺利运行PyQt6程序。 在使用Python的PyQt6库进行GUI开发时,有时会遇到Imp…

    2025年12月14日
    000
  • Python OOP 测试失败问题排查与解决:类型检查与标准输出重定向

    正如摘要所述,本文旨在帮助开发者解决Python面向对象编程(OOP)测试中遇到的类型检查问题,特别是当测试用例期望特定类型的错误信息输出时。通过分析测试失败的原因,并结合标准输出重定向技术,提供了一种有效的解决方案,确保代码能够正确处理类型错误并产生预期的输出结果。 问题分析 在编写Python类…

    2025年12月14日
    000
  • 深入解析与解决 PyQt6 “DLL load failed” 导入错误

    本教程旨在解决使用 PyQt6 时常见的 “DLL load failed while importing QtCore” 错误。该问题通常源于复杂的依赖冲突或不完整的组件安装。核心解决方案是执行一次彻底的 PyQt6 及其相关组件的卸载,确保清除所有潜在冲突,然后进行干净的…

    2025年12月14日
    000
  • Python OOP 单元测试失败:类型检查与标准输出捕获

    正如前文所述,本文旨在解决 Python OOP 单元测试中关于标准输出断言的问题。以下将详细阐述如何处理此类情况,并提供相应的代码示例和注意事项。 问题分析:__init__ 方法与测试逻辑 问题的核心在于测试用例期望通过修改 book.page_count 的值来触发错误消息,但实际上,错误消息…

    2025年12月14日
    000
  • Python OOP测试中的__init__方法与标准输出捕获

    在Python面向对象编程中,测试__init__方法产生的副作用(如打印到标准输出)时,需要特别注意标准输出的捕获时机。本文将深入探讨一个常见陷阱:当__init__方法包含print()语句用于错误提示时,如何正确地使用io.StringIO和sys.stdout来捕获这些输出,确保测试能够准确…

    2025年12月14日
    000
  • 使用Python和NumPy生成并筛选具有特定结构和关联条件的3×3矩阵教程

    本教程详细阐述了如何利用Python的itertools库生成所有可能的3×3矩阵,其元素取自集合{0,1,2}。在此基础上,我们将深入探讨如何通过NumPy高效地筛选出满足特定首行、首列固定值,以及一系列复杂内部关联条件的矩阵。文章提供了完整的代码示例和详细解释,旨在帮助读者理解和实现多…

    2025年12月14日
    000
  • Python大型数据集嵌套循环性能优化:高效分组策略与实践

    本文旨在解决Python处理大型数据集时,传统嵌套循环导致的性能瓶颈。通过深入分析低效模式,教程将详细介绍两种核心优化策略:基于哈希表的纯Python defaultdict分组法和利用Pandas库的 groupby 功能。文章将提供具体代码示例、性能对比,并探讨在不同场景下选择最佳优化方案的考量…

    2025年12月14日
    000
  • 生成满足特定首行、首列及自定义关联条件的3×3矩阵

    本文详细介绍了如何使用Python和NumPy库生成所有可能的3×3矩阵,其元素取自集合{0,1,2}。在此基础上,教程将逐步演示如何根据预设的首行和首列(例如[0,1,2])进行筛选,并进一步应用一系列复杂的自定义条件,包括一个类似“关联性”的逻辑,最终找出所有符合这些严格要求的矩阵。 …

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信