Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >这个Python程序优化以后减少2行代码但速度快了1亿亿亿倍

这个Python程序优化以后减少2行代码但速度快了1亿亿亿倍

作者头像
Python小屋屋主
发布于 2024-06-04 11:44:14
发布于 2024-06-04 11:44:14
1230
举报
文章被收录于专栏:Python小屋Python小屋

问题描述:

查找所有n位黑洞数。这里黑洞数是指该自然数各位数字组成的最大数与最小数之差仍为原自然数本身,例如6174是4位黑洞数,有7641-1467=6174。

思路与优化:

对于上面的问题,很自然的想法是枚举所有n位数并检查是否为黑洞数。

当参数n较小时,上面的代码运行很好,但随着n的变大,代码运行时间急剧增加以至于无法忍受甚至在计算上不可行。

分析上面的代码,每次循环中的计算量并不大,之所以慢是因为循环次数太多,也就是搜索范围太大,并且其中很多测试是不必要的。

根据黑洞数的定义可知,同一组数字最多只能构成一个黑洞数,找到一个黑洞数之后这组数字的其他排列都可以直接跳过。

忽略顺序的话可以使用组合来求解,又因为黑洞数的各位数字是允许重复的,所以需要借助于允许重复的组合来求解。

同样是穷举算法,改写后的代码没有多余的测试,每组数字只测试一次,大幅度减少了搜索范围。那么效率提升具体怎样呢,写几行代码测试和比较一下,红色下画线为第一个函数的运行时间(单位:秒),绿色下画线为改写后第二个函数的运行时间。可以看到,在位数并不太大的时候,效率已经提升了几十万倍。

运行结果:

稍微改写代码,继续增加位数长度并单独测试第二个函数,第一个函数对于这样的长度已经无能为力了。n=28时第一个函数的搜索范围约为10**27,第二个函数搜索范围为组合数C(10+28-1,28)=124403620,第一个函数是第二个函数的10**18倍。n=35时,第一个函数的搜索范围约为10**34,第二个函数搜索范围为组合数C(10+35-1,35)=708930508,第一个函数是第二个函数的10**25倍。

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数字黑洞
数字黑洞简介: 黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。—《互动百科》
lexingsen
2022/02/24
7140
【PAT乙级】数字黑洞
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
5590
用Numba加速Python代码
说这句话的人也没有错。与许多其他编程语言相比,Python很慢。Benchmark game有一些比较不同编程语言在不同任务上的速度的可靠的基准。
AiTechYun
2019/07/04
2.3K0
隔板法 学习笔记
在组合数学中,隔板法(又叫插板法)是排列组合的推广,主要用于解决不相邻组合与追加排列的问题。 隔板法就是在n个元素间插入(b-1)个板,即把n个元素分成b组的方法。——百度百科
yzxoi
2022/09/19
1.1K0
隔板法 学习笔记
Mathematica 谜中智 | 奥运五环 数字谜题(谜底)
奥运五环中的秘密,你找到了吗? 谢谢@翁德平的回答。 共有8组答案,数字按下图位置和顺序摆放。答案分别是: 925461738, 837164529, 941832567, 765238149, 765283194, 491382567, 861743295, 592347168。 解题 使用函数:Permutations,Select, Union, MemberQ, FromDigits, Timing。 方法一:数学思维 本题虽小,但我们也可以探讨一下解题思路,如下从两个层次,数学和算法分别来
WolframChina
2018/05/31
3.2K0
python每日一练(3)
有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
ImAileen
2024/01/18
1510
python每日一练(3)
【组合数学】生成函数 ( 正整数拆分 | 重复有序拆分 | 不重复有序拆分 | 重复有序拆分方案数证明 )
这种形式可以使用 不定方程非负整数解个数 的生成函数计算 , 是 带系数 , 带限制条件的情况 , 参考 : 组合数学】生成函数 ( 使用生成函数求解不定方程解个数 )
韩曙亮
2023/03/28
2.8K0
针对递归函数的优化与Python修饰器实现
我们围绕一个数学问题来说明本文的思想,组合数C(n,i),也就是从n个元素中任选i个,共有多少种选法。当然,这个问题有很多种求解方法,例如【最快的组合数算法之Python实现】。本文主要分析组合数的递归求解方法,也就是著名的帕斯卡公式C(n,i) = C(n-1, i) + C(n-1, i-1),首先编写出可以运行的正确代码,然后再进行优化和改进。 import time from functools import wraps def f0(n, i): '''原始版本,随着参数的增大很快就会崩溃'''
Python小屋屋主
2018/04/16
9130
程序员的数学---数学思维的锻炼
来看一道简单的题目:今天星期日,那么 100 天以后星期几? 这个问题最笨的方法就是数数了。不过那样也是颇为费事,从余数方向考虑:一个礼拜 7 天,100 天等于 14 个礼拜周期还剩两天(100 = 14*7 + 2)。于是答案就是星期 2 了。
指点
2019/01/18
1.1K0
程序员的数学---数学思维的锻炼
PAT乙级题目答案汇总PAT (Basic Level) Practice (中文)
专栏链接 https://blog.csdn.net/shiliang97/category_9294537_2.html
韩旭051
2020/02/18
3.2K0
程序员数学基础【四、取模应用-判断奇偶数、判断素数、求两个数的最大公约数、水仙花数】(Python版本)
由于此类语言入门非常容易,哪怕初中生亦可以,并且本科/研究生写论文、做实验多数所用语言都是【Python】故而选择此语言。
红目香薰
2022/11/28
6650
代码生成「神⋅提示」,比新手程序员快100倍!地位堪比make it more X
2023年11月,在ChatGPT支持DALL-3功能后,一个爆火的图像生成玩法是,不断迭代提示词「make it more X」,生成的图片越来越抽象。
新智元
2025/02/15
810
代码生成「神⋅提示」,比新手程序员快100倍!地位堪比make it more X
14万程序员挑战过的算法题,看看你处于哪个阶段?(附答案)
程序员都想挑战这四道算法趣题!通过挑战你也可以看到自己大体处于哪个级别。 在挑战之前,先介绍下问题的具体形式: 每个问题大致分为“问题”和“详解”两部分。 请各位先通读问题描述,并动手编写程序尝试解题。在这个过程中,具体的实现方法是其次,更重要的是思考“通过哪些步骤来实现才能够解决问题”。 每个问题都有思路讲解和源代码示例。请留意自己编程时在处理速度、可读性等方面进行的优化,和本文的源代码示例有什么不同。如果事先看了思路讲解和答案,就会失去解题的乐趣,所以这里建议大家先编程解题,再看讲解。 为了大家更好的享
BestSDK
2018/03/01
1.1K0
14万程序员挑战过的算法题,看看你处于哪个阶段?(附答案)
程序员的数学
有理数是整数和分数的集合,有理数的小数部分是有限或者无限循环的数;小数部分为无限不循环的数为无理数;
tandaxia
2019/05/23
1.2K0
常见 Python 代码优化技巧
代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构、优化、扩展以及文档相关的事情通常需要消耗 80% 的工作量。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。
昱良
2019/08/06
1.2K0
你一定能看懂的算法基础书(代码示例基于Python)
本文引自图灵教育《算法图解》 你一定能看懂的算法基础书;代码示例基于Python;400多个示意图,生动介绍算法执行过程;展示不同算法在性能方面的优缺点;教会你用常见算法解决每天面临的实际编程问题。 算法简介 本章内容 为阅读后续内容打下基础。 编写第一种查找算法——二分查找。 学习如何谈论算法的运行时间——大O表示法。 了解一种常用的算法设计方法——递归。 1.1 引言 算法是一组完成任务的指令。任何代码片段都可视为算法,但本书只介绍比较有趣的部分。本书介绍的算法要么速度快,要么能解决有趣的问题,要
AI科技大本营
2018/04/27
1.3K0
你一定能看懂的算法基础书(代码示例基于Python)
一天一大 leet(把数字翻译成字符串)难度:中等 DAY-9
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
前端小书童
2020/09/24
4140
一天一大 leet(把数字翻译成字符串)难度:中等 DAY-9
超越OpenCV速度的MorphologyEx函数实现(特别是对于二值图,速度是CV的4倍左右)。
       最近研究了一下opencv的 MorphologyEx这个函数的替代功能, 他主要的特点是支持任意形状的腐蚀膨胀,对于灰度图,速度基本和CV的一致,但是 CV没有针对二值图做特殊处理,因此,这个函数对二值图的速度和灰度是一样的,但是这个函数,如果使用的话,估计大部分还是针对二值图像,因此,我对二值图做了特别优化,速度可以做到是CV这个函数的4倍左右。
用户1138785
2022/05/11
1.6K0
超越OpenCV速度的MorphologyEx函数实现(特别是对于二值图,速度是CV的4倍左右)。
C++系列-第3章循环结构-29-累乘和连除
在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/
IT从业者张某某
2024/01/20
5320
C++系列-第3章循环结构-29-累乘和连除
因为简单!我的第一本算法书,就被女友抢走了...
假设要在电话簿中找一个名字以K打头的人,(现在谁还用电话簿!)可以从头开始翻页,直到进入以K打头的部分。但你很可能不这样做,而是从中间开始,因为你知道以K打头的名字在电话簿中间。
AI科技大本营
2019/06/20
4490
因为简单!我的第一本算法书,就被女友抢走了...
推荐阅读
相关推荐
数字黑洞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档