时不时地,当我了解Python的新功能时,或者我发现其他一些人不知道该功能时,我会记下它。,在过去的几周中,我最近了解或实现了一些有趣的功能-Stack Overflow。,这里有十个精巧的Python开发技巧,我敢肯定您从未见过。 快速浏览其中一些功能,以及每个功能的概要。,注意:
代码在此故事中显示为图像。 此外,您将在最后获得GitHub Readme链接,以进一步进行实验。,1. 如何在运行状态下查看源代码?,查看该函数的源代码,我们通常使用IDE来完成。,例如,在PyCharm中,您可以使用Ctrl +鼠标输入功能的源代码。,如果没有IDE怎么办?,目前,我们可以使用inspect而不是IDE来帮助您完成这些事情,inspect.getsource:返回对象源代码的文本。,检查模块提供了几个有用的功能,以帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。,此模块提供的四种主要服务:,2. 查看包路径的最快方法,当使用import导入软件包或模块时,Python将在某些目录中查找,并且这些目录具有优先级顺序,通常我们将使用sys.path进行查看。,有没有更快的方法?,在这里我想介绍一种比上面更方便的方法,可以解决一行命令:,从输出中,您可以发现此列的路径将比sys.path(包含用户环境的目录)更完整。,3. 将嵌套的循环写为一行,我们经常使用以下嵌套的循环代码:,这里只有三个for循环,在实际编码中,可能会有更多的层。,这样的代码可读性很差,人们不想编写它,并且有一种更好的编写方法。,在这里,我介绍一种常用的编写方法,该方法使用itertools库实现更优雅和可读的代码。,4. 如何使用打印输出日志,许多人喜欢使用打印来调试代码并记录
程序的运行过程。,但是,打印只会将内容输出到终端,而不能保留到日志文件中,这不利于故障排除。,如果您热衷于使用打印来调试代码(尽管这不是最佳实践),请记录运行程序的过程,那么下面描述的打印用法可能对您有用。,在Python 3中将其打印为函数,因为它可以接收更多参数,所以函数本身变得更强大。,代码如下所示:,5. 如何快速计算功能运行时间,计算一个函数的运行时间,你可以这样,您会看到编写了几行代码来计算函数的运行时间。,有没有一种方法可以更方便地计算运行时间? 是的,使用称为timeit的内置模块。,只需一行代码即可使用,结果如下:,6. 使用内置的缓存机制来提高效率,缓存是一种存储定量数据以满足后续采集需求的方法,旨在加快数据采集的速度。,数据生成过程可能需要诸如计算,正则化和远程获取之类的操作。 如果同一数据需要多次使用,则每次重新生成都将浪费时间。,因此,如果将通过诸如计算或远程请求之类的操作获得的数据进行缓存,则将加速后续的数据获取需求。,为了达到这个要求,Python 3.2+为我们提供了一种易于实现的机制,而无需您编写这样的逻辑代码。,该机制是在functool模块的lru_cache装饰器中实现的。,参数解释:,例如:,输出如下,您可以看到第二个调用不执行函数主体,而是直接将结果返回到缓存中:,以下是经典的斐波那契数列,当您指定较大的n时,会有很多重复的计算,现在可以将第6点中介绍的timeit用于测试可以提高多少效率。,如果不使用lru_cache,则运行时间为31秒:,使用lru_cache后,运行速度过快,因此我将n的值从30调整为500,但是即使这样,运行时间也只有0.0004秒。 速度的提高非常显着。,7. 在程序退出之前执行代码的提示,使用内置模块atexit,您可以轻松注册和退出功能。,无论您在哪里导致程序崩溃,它都会执行您已注册的功能。 例子如下:,结果如下:,如果clean()函数具有参数,则可以在不使用修饰符的情况下调用atexit.register(clean_1,参数1,参数2,参数3 =" xxx")。,也许您还有其他方法可以处理这种需求,但是与不使用atexit相比,它更优雅,更方便,并且易于扩展。,但是使用atexit仍然有一些限制,例如:,8. 如何关闭异常关联上下文?,当您处理异常时,由于处理不当或其他问题,当引发另一个异常时,抛出的异常还将携带原始异常信息。,再次阅读它,您现在一定会理解。,像这样。,您可以从输出中看到两条异常消息:,如果在异常处理程序或finally块中引发异常,则默认情况下,异常机制将隐式工作,以将先前的异常附加为新异常的__context__属性。,这是Python默认情况下启用的自动关联异常上下文。,如果要自己控制此上下文,则可以添加一个from关键字(from的限制是第二个表达式必须是另一个异常类或实例。)以指示哪个异常导致了您的新异常。,输出如下,当然,您也可以使用with_traceback()方法设置异常的__context__属性,这也可以在回溯中更好地显示异常信息。,最后,是否要完全关闭这种自动关联异常上下文的机制? 我们还能做什么?,可以使用引发…从无,从下面的示例,没有原始异常,9. 实施类似延迟的呼叫,Golang中有一种延迟通话的机制。 关键字为defer,如下所示,myfunc的调用将在函数返回之前完成,即使您在函数的第一行上编写了myfunc的调用,这也是延迟的调用。 输出如下,,那么Python中有这种机制吗?,当然有,但是没有Golang这么简单。,我们可以使用Python上下文管理器来达到这种效果,输出如下,10. 如何流式读取大文件,使用with…open…可以从文件中读取数据,这是所有Python开发人员都非常熟悉的操作。,但是,如果使用不当,也会造成很大的麻烦。,例如,当您使用读取功能时,Python会将文件内容一次全部加载到内存中。 如果文件具有10 GB或更多,则计算机将消耗的内存非常大。,对于此问题,您可能会考虑使用readline作为生成器来逐行返回。,但是,如果此文件的内容在一行中,则每行10 GB,您仍将一次读取所有内容。,最优雅的 解决方案是使用read方法指定一次只读取固定大小的内容。 例如,在下面的代码中,一次仅返回8kb。,上面的代码在功能上没有问题,但是代码看起来还是有点肿。,使用部分函数和迭代函数,您可以像这样
优化代码,总结一下,声明:免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发,送邮件至:operations@edns.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。本站原创内容未经允许不得转载,或转载时,需注明出处:新网idc知识百科,
时不时地,当我了解Python的新功能时,或者我发现其他一些人不知道该功能时,我会记下它。
在过去的几周中,我最近了解或实现了一些有趣的功能-Stack Overflow。
这里有十个精巧的Python开发技巧,我敢肯定您从未见过。 快速浏览其中一些功能,以及每个功能的概要。
注意:代码在此故事中显示为图像。 此外,您将在最后获得GitHub Readme链接,以进一步进行实验。
1. 如何在运行状态下查看源代码?
查看该函数的源代码,我们通常使用IDE来完成。
例如,在PyCharm中,您可以使用Ctrl +鼠标输入功能的源代码。
如果没有IDE怎么办?
当我们想使用一个函数时,我们如何知道该函数需要接收哪些参数? 当我们在使用函数时遇到问题时,如何通过阅读源代码来解决问题?
目前,我们可以使用inspect而不是IDE来帮助您完成这些事情
inspect.getsource:返回对象源代码的文本。
检查模块提供了几个有用的功能,以帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。
此模块提供的四种主要服务:
类型检查, 获取源代码, 检查类和功能 检查解释器堆栈。
2. 查看包路径的最快方法
当使用import导入软件包或模块时,Python将在某些目录中查找,并且这些目录具有优先级顺序,通常我们将使用sys.path进行查看。
有没有更快的方法?
在这里我想介绍一种比上面更方便的方法,可以解决一行命令:
从输出中,您可以发现此列的路径将比sys.path(包含用户环境的目录)更完整。
3. 将嵌套的循环写为一行
我们经常使用以下嵌套的循环代码:
这里只有三个for循环,在实际编码中,可能会有更多的层。
这样的代码可读性很差,人们不想编写它,并且有一种更好的编写方法。
在这里,我介绍一种常用的编写方法,该方法使用itertools库实现更优雅和可读的代码。
4. 如何使用打印输出日志
许多人喜欢使用打印来调试代码并记录程序的运行过程。
但是,打印只会将内容输出到终端,而不能保留到日志文件中,这不利于故障排除。
如果您热衷于使用打印来调试代码(尽管这不是最佳实践),请记录运行程序的过程,那么下面描述的打印用法可能对您有用。
在Python 3中将其打印为函数,因为它可以接收更多参数,所以函数本身变得更强大。
代码如下所示:
5. 如何快速计算功能运行时间
计算一个函数的运行时间,你可以这样
您会看到编写了几行代码来计算函数的运行时间。
有没有一种方法可以更方便地计算运行时间? 是的,使用称为timeit的内置模块。
只需一行代码即可使用
结果如下:
6. 使用内置的缓存机制来提高效率
缓存是一种存储定量数据以满足后续采集需求的方法,旨在加快数据采集的速度。
数据生成过程可能需要诸如计算,正则化和远程获取之类的操作。 如果同一数据需要多次使用,则每次重新生成都将浪费时间。
因此,如果将通过诸如计算或远程请求之类的操作获得的数据进行缓存,则将加速后续的数据获取需求。
为了达到这个要求,Python 3.2+为我们提供了一种易于实现的机制,而无需您编写这样的逻辑代码。
该机制是在functool模块的lru_cache装饰器中实现的。
参数解释:
maxsize:此函数调用最多可以缓存多少个结果,如果为None则没有限制,设置为2的幂时,性能最佳 类型:如果为True,则将分别缓存不同参数类型的调用。
例如:
输出如下,您可以看到第二个调用不执行函数主体,而是直接将结果返回到缓存中:
以下是经典的斐波那契数列,当您指定较大的n时,会有很多重复的计算
现在可以将第6点中介绍的timeit用于测试可以提高多少效率。
如果不使用lru_cache,则运行时间为31秒:
使用lru_cache后,运行速度过快,因此我将n的值从30调整为500,但是即使这样,运行时间也只有0.0004秒。 速度的提高非常显着。
7. 在程序退出之前执行代码的提示
使用内置模块atexit,您可以轻松注册和退出功能。
无论您在哪里导致程序崩溃,它都会执行您已注册的功能。 例子如下:
结果如下:
如果clean()函数具有参数,则可以在不使用修饰符的情况下调用atexit.register(clean_1,参数1,参数2,参数3 =" xxx")。
也许您还有其他方法可以处理这种需求,但是与不使用atexit相比,它更优雅,更方便,并且易于扩展。
但是使用atexit仍然有一些限制,例如:
如果程序被尚未处理的系统信号杀死,则注册的功能将无法正常执行。 如果发生严重的Python内部错误,则无法正常执行您注册的函数。 如果手动调用os._exit(),则无法正常执行注册的功能。
8. 如何关闭异常关联上下文?
当您处理异常时,由于处理不当或其他问题,当引发另一个异常时,抛出的异常还将携带原始异常信息。
再次阅读它,您现在一定会理解。
像这样。
您可以从输出中看到两条异常消息:
如果在异常处理程序或finally块中引发异常,则默认情况下,异常机制将隐式工作,以将先前的异常附加为新异常的__context__属性。
这是Python默认情况下启用的自动关联异常上下文。
如果要自己控制此上下文,则可以添加一个from关键字(from的限制是第二个表达式必须是另一个异常类或实例。)以指示哪个异常导致了您的新异常。
输出如下
当然,您也可以使用with_traceback()方法设置异常的__context__属性,这也可以在回溯中更好地显示异常信息。
最后,是否要完全关闭这种自动关联异常上下文的机制? 我们还能做什么?
可以使用引发…从无,从下面的示例,没有原始异常
9. 实施类似延迟的呼叫
Golang中有一种延迟通话的机制。 关键字为defer,如下所示
myfunc的调用将在函数返回之前完成,即使您在函数的第一行上编写了myfunc的调用,这也是延迟的调用。 输出如下,
那么Python中有这种机制吗?
当然有,但是没有Golang这么简单。
我们可以使用Python上下文管理器来达到这种效果
输出如下
10. 如何流式读取大文件
使用with…open…可以从文件中读取数据,这是所有Python开发人员都非常熟悉的操作。
但是,如果使用不当,也会造成很大的麻烦。
例如,当您使用读取功能时,Python会将文件内容一次全部加载到内存中。 如果文件具有10 GB或更多,则计算机将消耗的内存非常大。
对于此问题,您可能会考虑使用readline作为生成器来逐行返回。
但是,如果此文件的内容在一行中,则每行10 GB,您仍将一次读取所有内容。
最优雅的解决方案是使用read方法指定一次只读取固定大小的内容。 例如,在下面的代码中,一次仅返回8kb。
上面的代码在功能上没有问题,但是代码看起来还是有点肿。
使用部分函数和迭代函数,您可以像这样优化代码
总结一下
我们可以使用inspect在运行状态下查看源代码 如果嵌套循环,可以使用itertools.product 随时间使用timeit模块来计算功能或代码段的运行时间 使用functool.lru_cache可以加快代码速度。 旨在加快数据采集速度 使用atexit模块注册您的功能,以便在导致程序崩溃的任何地方,它将执行您已注册的那些功能 通过将大文件分成固定大小的块来读取它
< div>【责任编辑:赵宁宁 TEL:(010)68476606】