• 手机站
  • 收藏
聚培教育网合作机构 > 长春达内教育
长春达内教育
400-998-6158
长春达内是专业的IT培训中心,专为各位学员提供php,java等程序设计课程
长春达内教育

深入解析 Python 中的上下文管理器

python学习网

更新时间:2021-10-29 浏览:82
核心提示:一般人们需要把一些实际操作放进一个代码块中,在代码块中实行时就可以*在某类运作情况,而当离去该代码块时就实行另一个实际

一般人们需要把一些实际操作放进一个代码块中,在代码块中实行时就可以*在某类运作情况,而当离去该代码块时就实行另一个实际操作,完毕当今情况;因此,简易而言,前后文管理工具的目标便是要求目标的运行范畴,假如超出就采用“解决”。Python给予了不一样的办法来管理方法实行時间。比如,您还可以应用Python的内嵌timeit控制模块来管理方法一小段编码的实施時间。

>>> import timeit

>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)

0.3018611848820001

可是,timeit.timeit涵数仅接纳字符串数组,假如要管理方法较为复杂的涵数的时候会有局限。下列实例向您展现怎么使用timeit控制模块运作和管理方法涵数。

def test()

: """Stupid test function"""

L = [i for i in range(100)]

if ._name._ == '._main._':

import timeit

print(timeit.timeit("test()", setup="from ._main._ import test"))

虽然它还可以工作中,但看着并没有真实的pythonic。管理方法实行的时间的另一种办法是运用Python的内嵌cProfile控制模块,可是并不建议用它,事实上它并不是很精准,这都是一种变通方法,可使您掌握一些字符串常量*须 实行多久。您可以根据下列方法体验它:

>>> python -m cProfile <file_name.py>

即然上边的俩种办法都并不是十分Pythonic而且都是有缺点,那麼大家怎样完成一个非常很好的解决方法呢?

其实不是很难:大家只需能取得程序流程逐渐实行和完毕实行的时间段就可以了,下边详细介绍具体做法,Python有一个内嵌控制模块可供大家应用:time。

>>> import time

>>> start = time.time()

>>> # do some stuff

>>> end = time.time()

>>> print(f"Elapsed Time: {end - start}")

可是那样写并不是很便捷。我们可以组建一个前后文管理工具。

建立一个前后文管理工具

应用Python建立前后文管理工具有三种不一样方式 ,大家将科学研究二种办法来完成此目地:根据类和根据制作器的前后文管理工具。

根据类的前后文管理工具

要建立根据类的前后文管理工具,*须 先完成法术自变量._enter._和._exit._。进到前后文(或代码块)时启用**个,离去前后文时启用后面一种。

拥有这种提前准备,大家就可以来创造一个完成这二种方式 的Timer类。进到代码块时,大家期待获得现在时间并将其存储到表明准备的自变量中。如果我们离去代码块,大家想获得现在时间并从这当中减掉开始时间。結果被打印出出去。

为了更好地自定輸出,大家让客户特定一个句子,该句子在通过的时间段以前打印出。下列关键点向您分享了一个既用型的类。

from time import time

class Timer(object):

def ._init._(self, description):

self.description = description

def ._enter._(self):

self.start = time()

def ._exit._(self, type, value, traceback):

self.end = time()

print(f"{self.description}: {self.end - self.start}")

with Timer("List Comprehension Example"):

s = [x for x in range(10_000_000)]

根据制作器的前后文管理工具

根据制作器的方式 比较简易。我们可以组建一个包括操作程序的制作器涵数(获得开始与结束時间及其打印出通过的時间)。@contextmanager装饰器根据应用GeneratorContextManager目标包裝制作器,将制作器作用转换成为恰当的前后文管理工具。

from contextlib import contextmanager

from time import time

@contextmanager

def timing(description: str) -> None:

start = time()

yield

ellapsed_time = time() - start

print(f"{description}: {ellapsed_time}")

with timing("List Comprehension Example"):

s = [x for x in range(10_000_000)]

假如进行了with后边的代码块,将跳返回yield关键词以后的部位执行。

汇总

在文中中,大家学了怎样构建自身的時间前后文管理工具。掌握基本要素,我们可以根据四种方法完成前后文管理工具:根据类和根据制作器。转化成的类和制作器涵数能够立即应用。

更多>同类资讯
更多>相关课程
顶部