异步计算斐波那契数列大数值项(千万数级)的值

简介: 异步计算斐波那契数列,半分钟可以计算出第5000万项的数值。

异步编程

异步计算斐波那契数列,半分钟可以计算出第5000万项的数值。

完整代码

import sys, time, asyncio
def timer(func):  
    def wrapper(*args, **kwargs):  
        start_time = time.time()  
        result = func(*args, **kwargs)  
        end_time = time.time()  
        print(f"{func.__name__} took {end_time - start_time} seconds to run.")  
        return result  
    return wrapper
def fib(n):
    if n<600:
        n1 = n2 = 1
        for _ in range(2,n):
            n1,n2 = n1+n2,n1
        return n1
    t = n//2
    if n%2:
        return fib(t+1)**2 + fib(t)**2
    else:
        return fib(t+1)**2 - fib(t-1)**2
@timer
def Fib(n):
    return fib(n)
async def asyncFib(n):
    res = Fib(n)
    print(res)
async def main():
    await asyncio.gather(*tasks)
if __name__ == "__main__":
    sys.set_int_max_str_digits(0)
    parms = [5000_0000, 2000_0000, 1000_0000]
    tasks = [asyncFib(p) for p in parms]
    loop = asyncio.run(main())

image.gif

输出结果

Fib took 29.4418728351593 seconds to run.

Squeezed text(121505 lines).

Fib took 5.968385457992554 seconds to run.

Squeezed text(121505 lines).

Fib took 2.031674385070801 seconds to run.

Squeezed text(121505 lines).

Fib took 0.0 seconds to run.

33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875

代码分析

耗时装饰器

def timer(func):  

   def wrapper(*args, **kwargs):  

       start_time = time.time()  

       result = func(*args, **kwargs)  

       end_time = time.time()  

       print(f"{func.__name__} took {end_time - start_time} seconds to run.")  

       return result  

   return wrapper

@timer

def Fib(n):

   return fib(n)

斐波那契数列

def fib(n):

   if n<600:

       n1 = n2 = 1

       for _ in range(2,n):

           n1,n2 = n1+n2,n1

       return n1

   t = n//2

   if n%2:

       return fib(t+1)**2 + fib(t)**2

   else:

       return fib(t+1)**2 - fib(t-1)**2

使用以下两个恒等式快速缩小fib()函数参数n的量级,极速减少函数递归的次数:

fib(2*t+1)=fib(t+1)**2 + fib(t)**2

fib(2*t)=fib(t+1)**2 - fib(t-1)**2

异步函数

async def asyncFib(n):

   res = Fib(n)

   print(res)

async def main():

   await asyncio.gather(*tasks)

设置字串处理的最大位数

sys.set_int_max_str_digits(0)

新版python默认只能最大处理4300位的字串,参数为0即解除长度限制。也可以设置具体数据为限制最长长度,比如sys.set_int_max_str_digits(10000),注意本例中fib(5000_0000)的值有几千万位,需要设置1亿位sys.set_int_max_str_digits(1_0000_0000)。

目录
相关文章
|
6月前
|
前端开发 JavaScript 关系型数据库
终于找到它了,别再等客户提需求才开始找,开发者必备!这个开源HR工具竟然能替代市面上90%的人事系统,还能免费商用!
Frappe HR 是一款开源、现代化的人力资源与薪资管理软件,基于 Frappe 框架构建,提供员工全生命周期管理、请假考勤、费用报销、绩效管理和薪资税务处理等功能。支持移动应用和多种部署方式(托管或本地),技术架构稳定且可扩展。相比同类项目,Frappe HR 具备高度自定义能力与成本效益,适合各规模企业。项目地址:https://github.com/frappe/hrms。
401 2
|
前端开发 JavaScript 开发者
【第44期】一文了解全新框架Remix
【第44期】一文了解全新框架Remix
1764 0
|
分布式计算 并行计算 大数据
Python多进程在数据处理和大数据分析中的应用
Python多进程在数据处理和大数据分析中的应用
260 0
|
域名解析 数据采集 网络协议
11个国内外免费域名解析服务
 一般域名使用注册商提供的域名解析服务虽然方便,但功能大多有限,特别是目前国内还会针对某些DNS服务器进行屏蔽,造成网站无法解析的情况出现,因此,使用第三方域名解析服务也是中国网站的必要选择,这里就介绍一些常见的免费域名解析服务。
6403 0
|
安全 Android开发
【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmContinueOptimizati() 函数分析 )
【Android 逆向】整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmContinueOptimizati() 函数分析 )
246 0
|
人工智能 Java C++
《Java 2D游戏编程入门》—— 导读
多年前,当我第一次将软件开发作为专业工作的时候,有人请我编写一个applet。那时候,我对于Java语言知道得并不多。在整个上学期间,我很广泛地使用C++。我确实用Java编写过一些代码,但认为它太慢并且是C++的没落版。
2630 0
|
Linux 虚拟化
如何在虚拟机centos中安装VMware tool同时共享文件
  先共享本地主机文件夹:  在未启动虚拟机的情况下,点击centOS->编辑虚拟机设置->选项->共享文件夹->选择总是启用->点击添加->选择要共享的文件夹   安装虚拟机工具:  1.在centos启动情况下,虚拟机菜单->虚拟机->安装VMware tool 点击之后会在centos桌面弹出一个DVD的光盘,里面有 VMwareTools-8.
1426 0

热门文章

最新文章