范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python让程序轻松加速的方法

  最近,我读了一篇有趣的文章,文中介绍了一些未充分使用的Python特性的。在文章中,作者提到,从Python 3.2开始,标准库附带了一个内置的装饰器functools.lru_cache。我发现这个装饰器很令人兴奋,有了它,我们有可能轻松地为许多应用程序加速。
  你可能在想,这很好,但这个装饰器究竟是什么?它提供对已构建的缓存的访问,该缓存使用LRU(译者注: Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。)的置换策略,因此被命名为lru_cache。当然,这句话听起来可能有点令人胆怯,所以让我们把它分解一下。什么是缓存?
  缓存是一个可以快速访问的地方,可以在它里面存储访问速度较慢的内容。为了演示这一点,让我们以你的web浏览器为例。
  从网络上读取网页可能需要几秒钟,即使是快速的网络连接也如此。在计算机时代,这个问题是永恒的。为了解决这个问题,浏览器将你已经访问过的网页存储在计算机的缓存中,这样访问速度会加快数千倍。
  使用缓存下载网页的步骤如下:检查页面的本地缓存。如果页面在那里,返回该页面。在因网上找到网页并从那里下载。将该网页存储在缓存中,以便将来更快地访问。
  虽然缓存并不会让你第一次访问网页的速度加快,但通常你是要屡次访问某一个网站页面的(想想Facebook——注:对多数国人来讲,可能不是这个网站,或者你的电子邮件),有了缓存之后,以后每次访问都会更快。
  浏览器并不是唯一使用缓存的,从服务器到CPU和硬盘或SSD之间的计算机硬件,它们无处不在。从缓存中可以很快地获取数据,因此当你不止一次获取数据时,它可以大大加快程序的速度。LRU是什么意思?
  缓存只能存储有限数量的东西,而且通常它比可能存入所缓存的东西要小得多(例如,你的硬盘比互联网小得多)。这意味着有时需要将缓存中已有内容替换掉,放入其他内容。对于去掉什么的决策方法被称为置换策略。
  这就是LRU的用武之地。LRU代表最近用得最少的缓存中内容,这是一种常用的缓存置换策略。
  为什么置换策略很重要?
  "最近使用最少"这种置换策略的基本思想是:如果你有一段时间没有访问过某个东西,你可能近期不会访问它。要使用此策略,只需在缓存已满时删除最早使用的项即可。
  在上图中,缓存中的每个项都附带了访问时间。依据LRU策略,选择访问时间为2:55PM 的项作为要置换的项,因为它是最早被访问的。如果有两个对象具有相同的访问时间,那么LRU将从中随机选择一个。
  这种去掉长时间不用的东西的策略,被称为Bélády的最优算法,它是置换缓存内容的最佳策略。当然,我们根本不知道未来会有什么操作。谢天谢地,在许多情况下,LRU提供了近乎最佳的性能。怎样使用它?
  functools.lru_cache是一个装饰器,因此你可以将它放在函数的顶部:import functools  @functools.lru_cache(maxsize=128) def fib(n):   if n < 2:     return 1   return fib(n-1) + fib(n-2)
  Fibonacci数列在递归示例中经常被用到,要提升这个函数的速度,使用functools.lru_cache之后,不费吹灰之力,就能让这个递归函数狂飙。在我的机器上运行这些代码,得到了这个函数有缓存版本和没有缓存版本的以下结果。$ python3 -m timeit -s "from fib_test import fib" "fib(30)" 10 loops, best of 3: 282 msec per loop  $ python3 -m timeit -s "from fib_test import fib_cache" "fib_cache(30)" 10000000 loops, best of 3: 0.0791 usec per loop
  增加一行代码之后,速度提高了3565107倍。
  当然,我认为很难看出你在实际中会如何使用它,因为我们很少需要计算斐波那契数列。回到web页面示例,我们可以举一个更实际的用缓存渲染前端模板的例子。
  在服务器开发中,通常单个页面存储为具有占位符变量的模板。例如,下面是一个页面模板,该页面显示某一天各种足球比赛的结果。        

Matches for {{day}}

{% for match in matches %} {% endfor %}
Home team Away team Score
{{match["home"]}} {{match["away"]}} {{match["home_goals"]}} - {{match["away_goals"]}}
  呈现模板时,看起来如下所示:   这是缓存的主要目标,因为每天的结果不会改变,而且很可能每天会有多次访问。下面是一个提供此模板的Flask应用程序。我引入了50ms的延迟来模拟通过网络或者从大型数据库获取匹配字典。import json import time from flask import Flask, render_template app = Flask(__name__) with open("match.json","r") as f: match_dict = json.load(f) def get_matches(day): # simulate network/database delay time.sleep(0.05) return match_dict[day] @app.route("/matches/") def show_matches(day): matches = get_matches(day) return render_template("matches.html", matches=matches, day=day) if __name__ == "__main__": app.run()   使用requests在不缓存的情况下获得三天的数据,在我的计算机上本地运行平均需要171ms。这还不错,但我们可以做得更好,即使考虑到人为的延迟。 @app.route("/matches/") @functools.lru_cache(maxsize=4) def show_matches(day): matches = get_matches(day) return render_template("matches.html", matches=matches, day=day)   在本例中,我设置了maxsize=4,因为我的测试脚本只有相同的三天,最好设置2次幂。使用这种方法,10个循环的平均速度可以降到13.7ms。还有什么应该知道?   Python文档虽然很详细,但是有一些东西还是要强调的。内置函数   装饰器附带了一些很有用的内置函数。cache_info()返回访问数(hits)、未访问数(misses)和当前缓存使用量(currsize)、最大容量(maxsize),帮助你了解缓存使用情况。cache_clear()将删除缓存中的所有元素。有时候不要使用缓存   通常,只有在以下情况下才能使用缓存:在缓存期内,数据不会更改。函数将始终为相同的参数返回相同的值(因此时间和随机对缓存没有意义)。函数没有副作用。如果缓存被访问,则永远不会调用该函数,因此请确保不更改其中的任何状态。函数不返回不同的可变对象。例如,返回列表的函数不适合缓存,因为将要缓存的是对列表的引用,而不是列表内容。

小米推出骨传导耳机预售699元可提供12小时续航如今已有不少传统音频设备厂商已推出了骨传导无线蓝牙耳机,不过现在他们即将迎来小米的价格挑战,近期小米也推出了骨传导无线蓝牙耳机,产品预售价为699元。小米官方表示,小米骨传导耳机采连续八年包装饮用水市占率第一,农夫山泉DTC是如何持续增长的?在国内连续八年保持中国包装饮用水市场占有率第一的龙头农夫山泉是如何抓住全国软饮市场的渠道增长机遇?本篇文章将会从全渠道零售实现DTC转型和私域平台蓄流,增加用户终身价值两个方面分析日媒丰田下调本财年全球产量来源参考消息网参考消息网10月25日报道据日本经济新闻网站10月24日报道,丰田21日发布消息称,预计本财年(截至2023年3月)其全球产量将低于原计划的970万辆。该公司之前曾预四部门部署开展涉企违规收费专项整治联合检查行动中新网10月26日电市场监管总局26日消息,为深入贯彻落实党中央国务院关于推进减税降费的决策部署,按照市场监管总局发展改革委工业和信息化部财政部关于涉企违规收费专项整治行动联合检查亚足联官宣!中国男足落入第3档,最差分组出炉冲进8强如同夺冠U20亚洲杯决赛圈将在乌兹别克斯坦举办,时间是2023年3月1日至18日,并且赛事前四名将晋级2023年印度尼西亚U20世界杯。根据亚足联的官方消息,U20亚洲杯决赛阶段的抽签仪式巴黎人报巴黎愿和梅西签11续约至25年,要解决年薪等问题根据巴黎人报记者AdrienChantegrelet的最新报道,巴黎圣日尔曼正在考虑的是卡塔尔世界杯之后的梅西续约问题。巴黎人报的消息源透露,由于梅西的合同2023年夏天(也就是明广州队不敌泰山八轮不胜,后者下轮死磕海港或成争冠分水岭南都讯记者陶新蕾实习生吴俊杰广州队已有两个月没尝过胜利的滋味了。北京时间10月24日晚,在中超第19轮中,广州队客场0比3不敌卫冕冠军山东泰山,迎来八轮不胜。在积分榜上列第16位的女排蜕变!郎平里约12朵金花仅剩4人在役丁霞若离开战巴黎更悬昨晚,中国女排前国手自由人林莉通过社交平台宣布退役。至此,中国女排最近一个巅峰时刻里约奥运会上的12人主力阵容,只剩下朱婷袁心玥丁霞和龚翔宇四人还算严格意义上的现役球员,张常宁已经世体罗贝托将因伤缺席今年剩余的所有比赛直播吧10月25日讯据西班牙世界体育报报道,巴萨球员罗贝托在与毕尔巴鄂竞技的比赛中左肩受伤,他将缺席今年剩余的所有比赛。罗贝托之前就受到了伤病的困扰,他近期刚刚找回曾经的最佳状态,数据呈水性的思考做数据安全有段时间,恰听很多专家从不同视角来看数据安全,自己也有些见解,今天来看看数据安全的进化论,也就是关于数据安全从1。0到2。0再到3。0的思考。通过整个数据安全的框架可以得这几种食物,吃不完最好扔掉!不要觉得可惜,看完就明白了中国人向来以勤俭节约作为美德之一,并且在日常生活中,我们难免会有吃不完的剩饭剩菜。对于剩饭剩菜,再吃的时候,大家一般都会经过加热后再食用。但是你知道吗,有些食物并不适合二次加热了吃
人民币汇率怎么走?中美利差会倒挂多久?机构解读杰克逊霍尔央行年会记者王玉美联储主席杰罗姆鲍威尔周五晚在一年一度的杰克逊霍尔全球央行年会上表示,尽管7月通胀数据较低令人欣慰,但目前通胀率仍远高于2且劳动力市场极度紧张,现在并非暂停加息的合适时机。美股集体大跌,人民币继续大幅贬值,明天A股会大跌吗?本周A股表现不佳,市场亏钱效应明显,屋漏偏逢连夜雨,周五隔夜美股集体大跌,三大指数均大跌3以上。至于美股突发大跌,主要在于美联储主席鲍威尔在全球央行大会上发布了鹰派的言论,他提到7中俄签署输气协议,两国将用本币结算,普京卢布和人民币5050俄乌冲突爆发后,以美国为首的西方国家,虽然对俄发起了近万项制裁,但俄罗斯的针对性反击,也一直没有停止过。此前,在欧洲引进俄方天然气时,俄罗斯就出台过卢布结算令,欧盟国家一阵嘴硬后,2022年大额存单利息不到5,与银行存款对比,大额存单还值得吗大额存单在过去的时候,绝对是受到很多人的欢迎,因为大额存单的利息比较高,都接近5左右,甚至更高,于是,部分人银行存款也不要了,国债也看不上了,就选大额存单,大额存单成为香饽饽。现在破7又怎么样如何看待近期人民币对美元快速贬值?王永利(资深银行家)近期市场对人民币跌破7的预期明显增强,既要正视当前人民币贬值压力,可以采取必要措施抑制其过快贬值,防止出现失控局面,又不必对人民币对美元破7过于恐惧,相信国家有(经济)中国邮政启动第六届919电商节活动新华社北京9月1日电(记者赵文君)作为中国邮政全力打造的农村电商品牌,第六届中国邮政919电商节1日在北京启动。据介绍,依托邮乐网平台,今年的919电商节进一步拓宽农产品销售渠道,神奇的股市中国股市有价值投资,有投机,两种玩法。首先我介绍一下价值投资,有很多人玩价投,赶上牛市或选对股他们挣得盆满钵满,但是中国股市熊长牛短,很多人最后死在了漫长的熊市,之前挣多少最后都还过敏性鼻炎能根治吗季节交替,又到了过敏性鼻炎的高发期,一时间门诊患者个个喷嚏不断,鼻涕连连。很多患者求医若渴医生,过敏性鼻炎能根治吗?过敏性鼻炎又称变应性鼻炎,中医称之为鼻鼽。是由于人体接触到过敏原未来半导体9月1日重要芯闻发改委瞄准人工智能量子信息等前沿领域,实施一批具有前瞻性战略性的国家重大科技项目据求是网,国家发改委9月1日在求是杂志发表署名文章加快构建新发展格局牢牢把握发展主动权。文章指出,加vivoPad评测vivo搅局平板市场的得力悍将2022年的vivo,在稳住智能手机基本盘之后,终于推出了旗下首款平板电脑vivoPad。虽迟但到,虽晚犹新,vivoPad凭借扎实的基本功在发布会上便引得众人垂涎,而我印象更深刻俄乌战争九月上旬小结俄乌战争九月上旬小结俄乌战争进入中段,美国已经深度介入此次战争。美军间接参战方式值得我军深入研究的内容有三点第一,全息战场态势感知能力与预判能力(细微到班组部署),与即时生成的各种