python timeit用法_十大Python开发技巧

Python开发指南, 超级实用足以让您震撼

2678f74ad453365b96ee6c6e53dfa74e.png

> Photo by Christina Morillo from StockSnap

时不时地,当我了解Python的新功能时,或者我发现其他一些人不知道该功能时,我会记下它。

在过去的几周中,我最近了解或实现了一些有趣的功能-Stack Overflow

这里有十个精巧的Python开发技巧,我敢肯定您从未见过。 快速浏览其中一些功能,以及每个功能的概要。

注意:代码在此故事中显示为图像。 此外,您将在最后获得GitHub Readme链接,以进一步进行实验

01.如何在运行状态下查看源代码?

查看该函数的源代码,我们通常使用IDE来完成。

例如,在PyCharm中,您可以使用Ctrl +鼠标输入功能的源代码。

如果没有IDE怎么办?

· 当我们想使用一个函数时,我们如何知道该函数需要接收哪些参数?

· 当我们在使用函数时遇到问题时,如何通过阅读源代码来解决问题?

目前,我们可以使用inspect而不是IDE来帮助您完成这些事情

a516c8e7449b50125f9b15d836f077c3.png

inspect.getsource:返回对象源代码的文本。

6d0b751d20d01b5b698575742f11e40b.png

检查模块提供了几个有用的功能,以帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象

此模块提供的四种主要服务:

· 类型检查,

· 获取源代码,

· 检查类和功能

· 检查解释器堆栈。

02.查看包路径的最快方法

当使用import导入软件包或模块时,Python将在某些目录中查找,并且这些目录具有优先级顺序,通常我们将使用sys.path进行查看。

c53e12cbe4ce9019e468917b3b08619a.png

有没有更快的方法?

在这里我想介绍一种比上面更方便的方法,可以解决一行命令

c339d081cd519957086a0fb1859de8db.png

从输出中,您可以发现此列的路径将比sys.path(包含用户环境的目录)更完整。

03.将嵌套的循环写为一行

我们经常使用以下嵌套的循环代码

bd117c3bdd9b02e2aeafe173b6414528.png

这里只有三个for循环,在实际编码中,可能会有更多的层。

这样的代码可读性很差,人们不想编写它,并且有一种更好的编写方法。

在这里,我介绍一种常用的编写方法,该方法使用itertools库实现更优雅和可读的代码。

3af0bd06eeeedfd63c21fb1bd9152e01.png

04.如何使用打印输出日志

许多人喜欢使用打印来调试代码并记录程序的运行过程。

但是,打印只会将内容输出到终端,而不能保留到日志文件中,这不利于故障排除。

如果您热衷于使用打印来调试代码(尽管这不是最佳实践),请记录运行程序的过程,那么下面描述的打印用法可能对您有用。

在Python 3中将其打印为函数,因为它可以接收更多参数,所以函数本身变得更强大

代码如下所示:

ae5a8572633fd454043f544863f7afb2.png

05.如何快速计算功能运行时间

计算一个函数的运行时间,你可以这样

db9bca9e422f740769960eb77db6f3b6.png

您会看到编写了几行代码来计算函数的运行时间。

有没有一种方法可以更方便地计算运行时间? 是的,使用称为timeit的内置模块

只需一行代码即可使用

1466d4d20d2f6787f189d66149d9a3da.png

结果如下

2222210.020059824

06.使用内置的缓存机制来提高效率

缓存是一种存储定量数据以满足后续采集需求的方法,旨在加快数据采集的速度。

数据生成过程可能需要诸如计算,正则化和远程获取之类的操作。 如果同一数据需要多次使用,则每次重新生成都将浪费时间。

因此,如果将通过诸如计算或远程请求之类的操作获得的数据进行缓存,则将加速后续的数据获取需求。

为了达到这个要求,Python 3.2+为我们提供了一种易于实现的机制,而无需您编写这样的逻辑代码。

该机制是在functool模块的lru_cache装饰器中实现的。

7642381c0effb7c4066edb4a41e6209c.png

参数解释:

· maxsize:此函数调用最多可以缓存多少个结果,如果为None则没有限制,设置为2的幂时,性能最佳

· 类型:如果为True,则将分别缓存不同参数类型的调用。

例如

a85fd3cf08e898a6109bcf98eca1b07c.png

输出如下,您可以看到第二个调用不执行函数主体,而是直接将结果返回到缓存中

calculating: 1 + 233

calculating: 2 + 35

以下是经典的斐波那契数列,当您指定较大的n时,会有很多重复的计算

add68ed57956f0a19ab9e39b015d82d9.png

现在可以将第6点中介绍的timeit用于测试可以提高多少效率。

如果不使用lru_cache,则运行时间为31秒

8c012122d2d2617c23726b2ec2506613.png

使用lru_cache后,运行速度过快,因此我将n的值从30调整为500,但是即使这样,运行时间也只有0.0004秒。 速度的提高非常显着。

20b12633d51beaf27fcbdeef248a11c3.png

07.在程序退出之前执行代码的提示

使用内置模块atexit,您可以轻松注册和退出功能。

无论您在哪里导致程序崩溃,它都会执行您已注册的功能。 例子如下

7886103c7ca046861e93fdf6393bdbdb.png

结果如下:

0e2884fc36f62b9dcaab40d6e715b7d6.png

如果clean()函数具有参数,则可以在不使用修饰符的情况下调用atexit.register(clean_1,参数1,参数2,参数3 =" xxx")。

也许您还有其他方法可以处理这种需求,但是与不使用atexit相比,它更优雅,更方便,并且易于扩展。

但是使用atexit仍然有一些限制,例如:

· 如果程序被尚未处理的系统信号杀死,则注册的功能将无法正常执行。

· 如果发生严重的Python内部错误,则无法正常执行您注册的函数。

· 如果手动调用os._exit(),则无法正常执行注册的功能。

08.如何关闭异常关联上下文?

当您处理异常时,由于处理不当或其他问题,当引发另一个异常时,抛出的异常还将携带原始异常信息。

再次阅读它,您现在一定会理解:)

像这样。

e59a0420d29ea202e30820af70cbcc7d.png

您可以从输出中看到两条异常消息

da18931a99318f0037801088e4dc92a9.png

如果在异常处理程序或finally块中引发异常,则默认情况下,异常机制将隐式工作,以将先前的异常附加为新异常的__context__属性。

这是Python默认情况下启用的自动关联异常上下文。

如果要自己控制此上下文,则可以添加一个from关键字(from的限制是第二个表达式必须是另一个异常类或实例。)以指示哪个异常导致了您的新异常。

8dfdf083c8a9bf3f11018b076bfb9299.png

输出如下

a472a55f1abebde3f2cc41c89e19e037.png

当然,您也可以使用with_traceback()方法设置异常的__context__属性,这也可以在回溯中更好地显示异常信息。

8dfdf083c8a9bf3f11018b076bfb9299.png

最后,是否要完全关闭这种自动关联异常上下文的机制? 我们还能做什么?

可以使用引发…从无,从下面的示例,没有原始异常

45beee920e15a1cdcca42103b9c04140.png

09.实施类似延迟的呼叫

Golang中有一种延迟通话的机制。 关键字为defer,如下所示

92cb604178445c54885432665d52696d.png

myfunc的调用将在函数返回之前完成,即使您在函数的第一行上编写了myfunc的调用,这也是延迟的调用。 输出如下,

AB

那么Python中有这种机制吗?

当然有,但是没有Golang这么简单。

我们可以使用Python上下文管理器来达到这种效果

7f39558bc0047079c918faa1e0195c95.png

输出如下

AB

10.如何流式读取大文件

使用with…open…可以从文件中读取数据,这是所有Python开发人员都非常熟悉的操作。

但是,如果使用不当,也会造成很大的麻烦。

例如,当您使用读取功能时,Python会将文件内容一次全部加载到内存中。 如果文件具有10 GB或更多,则计算机将消耗的内存非常大。

b40459d7a5d7b430f32db36ac7890bfe.png

对于此问题,您可能会考虑使用readline作为生成器来逐行返回。

9a5a247fa40a6c6c6c7b63d0e77259e8.png

但是,如果此文件的内容在一行中,则每行10 GB,您仍将一次读取所有内容。

最优雅的解决方案是使用read方法指定一次只读取固定大小的内容。 例如,在下面的代码中,一次仅返回8kb。

b675a2994594f4ad78894175bec6e28b.png

上面的代码在功能上没有问题,但是代码看起来还是有点肿。

使用部分函数和迭代函数,您可以像这样优化代码

8280ef8c1302ae9773574c7d803fee23.png

总结一下

· 我们可以使用inspect在运行状态下查看源代码

· 如果嵌套循环,可以使用itertools.product

· 随时间使用timeit模块来计算功能或代码段的运行时间

· 使用functool.lru_cache可以加快代码速度。 旨在加快数据采集速度

· 使用atexit模块注册您的功能,以便在导致程序崩溃的任何地方,它将执行您已注册的那些功能

· 通过将大文件分成固定大小的块来读取它

而已! 你学到新东西了吗? 还是您想分享另一个技巧? 请在评论中让我知道!

这是GitHub自述文件的链接,以查看和分析每个技巧

是的 现在就像小min一样享受,我们做到了最后。 希望您学习新东西并对这些有效的开发技巧有一些基本的了解

7f9a5200f63bd80c858dd789fdf8be66.gif

> Source: Giphy

感谢您的阅读。 不要犹豫,继续关注更多!

(本文翻译自Pawan Jain的文章《Ten Python development skills》,参考:https://towardsdatascience.com/ten-python-development-skills-998a52f8f7c0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python编程中的经验(一直更新)

文章目录1. python基础语法1.1 怎么让两个list或者其它可以迭代的放到一起1.2 random.choice(x, n, replaceTrue) numpy中从某个数据集中选择1.3 如何根据key返回字典的value1.4 The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all…

Cairngorm初学者入门教程 第六节--Cairngorm中Command利用Delegate与Service连接

在上一节,我们利用FrontController 去映射 Event与Command 在这一节我们主要针对Command这部分动作做介紹。在RIA应用程序中,不可或缺的部份就是跟后台服务器连接进行数据传递。Command通过Delegate去做Services的部份(包含Remoting,WebServices,…等) C…

3d点击_3D打印服务加工在医疗器械行业的应用

3D打印技术如今已经很常见的出现在了我们日常的制造生产中。普通的3D打印机从最开始的几万块到如今的几千块,设备价格的降低也使得3D打印技术普及率的增加,而技术的普及也推动着技术的发展。3D打印开始应用到许多行业当中,下面悟空打印坊3D打…

所有算法库的使用(sklearn,scipy)

文章目录1. sklearn1.1 sklearn.preprocessing 之 fit 和 transform 以及 fit_transform1.2 算法之 fit 和 predict和predict_proba1.3 predict_proba1.4 各种评测指标1.4.1 R2R^2R21.4.2 准确度、精准率、召回率1.4.3 平均绝对误差(MAE)和均方误差(MSE)1.5 特征缩放 StandardS…

android aar保存图片文件异常_我去!合并AAR时踩坑了!

点击上方“刘望舒”,马上关注,早上8:42推送真爱,请置顶或星标作者: leeon7https://www.jianshu.com/p/8f7e32015836背景在输出Android模块时,有时会因为个别原因(比如来自业务的不可抗力),要求将模块打包成一个文件提供…

与kylin_Kylin 迁移到 HBase 实践在小米的实践

背景小米Kylin生产环境部署的是基于社区2.5.2修改的内部版本,所依赖HBase集群是一个公共集群,小米内部很多离线计算服务共享使用该HBase集群。由于Kylin已经产生超过6000张HBase表,给HBase的metadata管理造成了不小的压力,HBase m…

LeetCode 1227. 飞机座位分配概率(DP+数学归纳法)

1. 题目 有 n 位乘客即将登机,飞机正好有 n 个座位。第一位乘客的票丢了,他随便选了一个座位坐下。 剩下的乘客将会: 如果他们自己的座位还空着,就坐到自己的座位上, 当他们自己的座位被占用时,随机选择…

LeetCode 1025. 除数博弈(动态规划)

1. 题目 爱丽丝和鲍勃一起玩游戏&#xff0c;他们轮流行动。爱丽丝先手开局。 最初&#xff0c;黑板上有一个数字 N 。在每个玩家的回合&#xff0c;玩家需要执行以下操作&#xff1a; 选出任一 x&#xff0c;满足 0 < x < N 且 N % x 0 。用 N - x 替换黑板上的数字…

BN / LN / IN / GN /

链接 但是代码不敢苟同! 所以自己写了两种代码! 由于这只是测试, 并不是用来训练, 所以α和β参数就没有加! def BN(inputs):c inputs.shape[1]for i in range(c):channel inputs[:,i,:,:]mu np.mean(channel)var np.var(channel)channel_new ((channel - mu)/(np.sqrt(…

中文验证码 php_还在苦恼验证码怎么实现?看看这个验证码组件合集,你想要的都有...

随着安全性的要求越来越高&#xff0c;如今的验证码已经不再是简单的四个数字或者字母了&#xff0c;更复杂的图形验证码和行为验证码已经成为了更流行的趋势&#xff0c;但更难的实现也让很多开发者头秃&#xff0c;Gitee 已经替你们想到了这一点。不多说了&#xff0c;下面这…

reload端口 tomcat_tomcat上部署网站的三种方式

一、利用webapps文件夹自动部署这是最简单的方式&#xff0c;只要将网站直接拷贝到&#xff1a;tomcat根目录下的webapps文件夹里举例&#xff1a;helloworld文件夹下创建里index.html文件&#xff0c;然后把helloworld文件夹移动到tomcat根目录下webapps文件夹里&#xff0c;重…

不能用蛮力法解决的问题_溆浦事蒙汉:脱贫攻坚绝不能心浮气躁骄傲自满疲倦厌战...

脱贫攻坚绝不能心浮气躁骄傲自满疲倦厌战——蒙汉到卢峰镇检查“四支队伍”集村部工作情况检查南华山村“四支队伍”集村部工作情况与大潭村贫困户舒采米座谈红网溆浦讯(记者 伍交才)8月28日&#xff0c;市人大常委会副主任、县委书记蒙汉到卢峰镇南华山村、大潭村检查“四支队…

mock模拟接口测试 vue_vue+mock.js实现前后端分离

之前都是介绍在普通项目中使用mock.js&#xff0c;那么本次就来介绍一下在vue中使用mock.js实现前后端分离。安装&#xff1a;npm install mockjs这里先写个小案例介绍一下具体使用&#xff0c;写法不规范&#xff0c;仅供参考。然后案例讲完后我们讲具体的规范使用那么一起来看…

mysql slow log 分析工具_mysql slow log分析工具的比较

mysql 中的 slow log 是用来记录执行时间较长(超过 long_query_time 秒)的 sql 的一种日志工具。启用 slow log在 my.cnf 中设置[mysqld]slow_query_logonslow_query_log_filemysql-slow重启 MySQL 服务。五款常用工具mysqldumpslowmysqlslamyprofimysql-explain-slow-logmysql…

利用寄存器进入栈值交换

代码 varA, B: Word;beginA :1; B :2; asmmov ax, a //赋值 mov bx, b push ax //进栈 push bx pop ax //退栈 pop bx mov a, ax //利用栈先进后出, ax已退栈, 寄存器里的值为原bx 的值 mov b, bx //利用栈先进后出, bx已退栈, 寄存…

处理Excel,填充空白区域

在企业应用开发中经常是业务人员提供Excel的数据源&#xff0c;而开发人员将Excel数据导入到数据库中&#xff0c;然后在数据库中进行处理。在Excel中为了表示一种层次和所属关系&#xff0c;很多时候会产生很多空白的单元格。比如一个CRM数据&#xff0c;里面有销售团队、销售…

LeetCode 901. 股票价格跨度(单调栈)

1. 题目 编写一个 StockSpanner 类&#xff0c;它收集某些股票的每日报价&#xff0c;并返回该股票当日价格的跨度。 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数&#xff08;从今天开始往回数&#xff0c;包括今天&#xff09;。 例如&#xff0c…

LeetCode 1300. 转变数组后最接近目标值的数组和(二分查找)

1. 题目 给你一个整数数组 arr 和一个目标值 target &#xff0c;请你返回一个整数 value &#xff0c; 使得将数组中所有大于 value 的值变成 value 后&#xff0c;数组的和 最接近 target &#xff08;最接近表示两者之差的绝对值最小&#xff09;。 如果有多种使得和最接近…

潜在语义分析(Latent Semantic Analysis,LSA)

文章目录1. 单词向量空间、话题向量空间1.1 单词向量空间1.2 话题向量空间2. 潜在语义分析算法2.1 例子3. 非负矩阵分解算法4. TruncatedSVD 潜在语义分析实践一种无监督学习方法&#xff0c;主要用于文本的话题分析其特点是通过矩阵分解发现文本与单词之间的基于话题的语义关系…

python分割提取字符串_Python 字符串操作(截取/替换/查找/分割)

python字符串连接先介绍下效率比较低的&#xff0c;有些新手朋友就会犯这个错误&#xff1a;a [a,b,c,d]content for i in a:content content iprint content说下为什么效率会低呢&#xff1f;原因&#xff1a;在循环连接字符串的时候&#xff0c;他每次连接一次&#xff0…