Maison  >  Article  >  développement back-end  >  Comment calculer le temps d'exécution d'une fonction en Python ?

Comment calculer le temps d'exécution d'une fonction en Python ?

WBOY
WBOYavant
2023-04-22 09:43:072375parcourir

Le développement Python nécessite parfois une analyse des performances et une optimisation des performances. À ce stade, vous devez enregistrer certains problèmes de temps d'exécution de fonctions chronophages, puis optimiser la logique de la fonction.

Quelles sont les méthodes générales en python3.

1. Utilisez time.time()

Cette méthode est relativement simple, mais si vous souhaitez calculer le temps d'exécution de la fonction avec plus de précision, il y aura un manque de précision et il n'y a aucun moyen de compter le temps consommation de fonctions extrêmement courtes.

<pre class="brush:php;toolbar:false">import time    def func():  time.sleep(1)    t = time.time()  func()  print(f'耗时:{time.time() - t:.4f}s')    耗时:1.0050s</pre><pre class="brush:php;toolbar:false">import time  def func():  print('hello world')  t = time.perf_counter()  func()  print(f'耗时:{time.perf_counter() - t:.8f}s')  hello world  耗时:0.00051790s</pre>

2、使用time.perf_counter()

perf_counter是在python3.3新添加的,返回性能计数器的值,返回值是浮点型,统计结果包括睡眠的时间,单个函数的返回值无意义,只有多次运行取差值的结果才是有效的函数执行时间。

<pre class="brush:php;toolbar:false">timeit()函数有5个参数:  stmt 参数是需要执行的语句,默认为 pass  setup 参数是用来执行初始化代码或构建环境的语句,默认为 pass  timer 是计时器,默认是 perf_counter()  number 是执行次数,默认为一百万  globals 用来指定要运行代码的命名空间,默认为 None   import timeit  def func():  print('hello world')  print(f'耗时: {timeit.timeit(stmt=func, number=1)}')  hello world  耗时: 0.0007705999999999824</pre>

3、使用timeit.timeit ()

<pre class="brush:php;toolbar:false">import time   def coast_time(func):  def fun(*args, **kwargs):  t = time.perf_counter()  result = func(*args, **kwargs)  print(f'函数:{func.__name__} 耗时:{time.perf_counter() - t:.8f} s')  return result  return fun  @coast_time  def test():  print('hello world')  if __name__ == '__main__':  test()</pre>

4、使用装饰器统计

在实际项目代码中,可以通过装饰器方便的统计函数运行耗时。使用装饰器来统计函数执行耗时的好处是对函数的入侵性小,易于编写和修改。

装饰器装饰函数的方案只适用于统计函数的运行耗时,如果有代码块耗时统计的需求就不能用了,这种情况下可以使用 with 语句自动管理上下文。

(1)同步函数的统计

<pre class="brush:php;toolbar:false">import asyncio  import time  from asyncio.coroutines import iscoroutinefunction  def coast_time(func):  def fun(*args, **kwargs):  t = time.perf_counter()  result = func(*args, **kwargs)  print(f'函数:{func.__name__} 耗时:{time.perf_counter() - t:.8f} s')  return result  async def func_async(*args, **kwargs):  t = time.perf_counter()  result = await func(*args, **kwargs)  print(f'函数:{func.__name__} 耗时:{time.perf_counter() - t:.8f} s')  return result  if iscoroutinefunction(func):  return func_async  else:  return fun  @coast_time  def test():  print('hello test')  time.sleep(1)  @coast_time  async def test_async():  print('hello test_async')  await asyncio.sleep(1)  if __name__ == '__main__':  test()  asyncio.get_event_loop().run_until_complete(test_async())   hello test  函数:test 耗时:1.00230700 s  hello test_async  函数:test_async 耗时:1.00572550 s</pre>

(2)异步函数的统计

<pre class="brush:php;toolbar:false">import asyncio  import time   class CoastTime(object):  def __init__(self):  self.t = 0  def __enter__(self):  self.t = time.perf_counter()  return self  def __exit__(self, exc_type, exc_val, exc_tb):  print(f'耗时:{time.perf_counter() - self.t:.8f} s')  def test():  print('hello test')  with CoastTime():  time.sleep(1)  async def test_async():  print('hello test_async')  with CoastTime():  await asyncio.sleep(1)  if __name__ == '__main__':  test()  asyncio.get_event_loop().run_until_complete(test_async()) hello test 耗时:1.00723310 s hello test_async 耗时:1.00366820 s</pre>

5、with语句统计

通过实现 enter 和 exit 函数可以在进入和退出上下文时进行一些自定义动作,例如连接或断开数据库、打开或 关闭文件、记录开始或结束时间等,例如:我们用来统计函数块的执行时间。

with语句不仅可以统计代码块的执行时间,也可以统计函数的执行时间,还可以统计多个函数的执行时间之和,相比装饰器来说对代码的入侵性比较大,不易于修改,好处是使用起来比较灵活,不用写过多的重复代码。

rrreee

2. Utilisez time.perf_counter()🎜🎜perf_counter est nouvellement ajouté dans python3.3. Il renvoie la valeur du compteur de performances. La valeur de retour est un type à virgule flottante. les résultats statistiques incluent le temps de sommeil, la valeur de retour d'une seule fonction n'a pas de sens, seul le résultat de la différence de plusieurs exécutions est le temps d'exécution effectif de la fonction. 🎜🎜rrreee🎜🎜3. Utilisez timeit.timeit ()🎜🎜rrreee🎜🎜4. Utiliser les statistiques du décorateur🎜🎜Dans le code réel du projet, vous pouvez utiliser le décorateur. Temps de fonctionnement pratique de la fonction statistique. L'avantage d'utiliser des décorateurs pour compter le temps d'exécution d'une fonction est qu'ils sont moins intrusifs pour la fonction et faciles à écrire et à modifier. 🎜🎜Le schéma de décoration des fonctions avec des décorateurs ne convient que pour compter le temps d'exécution des fonctions. S'il est nécessaire de disposer de statistiques fastidieuses sur les blocs de code, il ne peut pas être utilisé dans ce cas, vous pouvez utiliser l'instruction with pour. gérer automatiquement le contexte. 🎜

(1) Statistiques des fonctions synchrones

🎜rrreee🎜

(2) Statistiques des fonctions asynchrones

🎜rrreee🎜🎜 5. Avec les statistiques de déclaration🎜🎜En implémentant les fonctions d'entrée et de sortie, vous pouvez effectuer certaines actions personnalisées lors de l'entrée et de la sortie du contexte, telles que la connexion ou la déconnexion de la base de données, l'ouverture ou la fermeture de fichiers, l'enregistrement de l'heure de début ou de fin, etc. , par exemple : on utilise Compter le temps d'exécution des blocs fonction. 🎜🎜L'instruction With peut non seulement compter le temps d'exécution des blocs de code, mais également le temps d'exécution des fonctions, et peut également compter la somme des temps d'exécution de plusieurs fonctions. Par rapport aux décorateurs, elle est plus intrusive dans le code et est plus intrusive. pas facile à modifier, l'avantage est qu'il est plus flexible à utiliser et ne nécessite pas d'écrire trop de code répété. 🎜🎜rrreee🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer