一般人们需要把一些实际操作放进一个代码块中,在代码块中实行时就可以*在某类运作情况,而当离去该代码块时就实行另一个实际操作,完毕当今情况;因此,简易而言,前后文管理工具的目标便是要求目标的运行范畴,假如超出就采用“解决”。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关键词以后的部位执行。
汇总
在文中中,大家学了怎样构建自身的時间前后文管理工具。掌握基本要素,我们可以根据四种方法完成前后文管理工具:根据类和根据制作器。转化成的类和制作器涵数能够立即应用。