Die Python-Entwicklung erfordert manchmal eine Leistungsanalyse und Leistungsoptimierung. Zu diesem Zeitpunkt müssen Sie einige zeitaufwändige Probleme bei der Ausführung von Funktionen aufzeichnen und anschließend die Funktionslogik optimieren.
Was sind die allgemeinen Methoden in Python3?
Diese Methode ist einfacher, aber wenn Sie die Ausführungszeit der Funktion genauer berechnen möchten, wird es fehlen Präzision und es gibt keine Möglichkeit, sie zu zählen. Sehr kurze Funktionen sind zeitaufwändig.
rrree
<div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Nach dem Login kopieren</div></div>
perf_counter是在python3.3新添加的,返回性能计数器的值,返回值是浮点型,统计结果包括睡眠的时间,单个函数的返回值无意义,只有多次运行取差值的结果才是有效的函数执行时间。
<div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Nach dem Login kopieren</div></div>
<div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Nach dem Login kopieren</div></div>
在实际项目代码中,可以通过装饰器方便的统计函数运行耗时。使用装饰器来统计函数执行耗时的好处是对函数的入侵性小,易于编写和修改。
装饰器装饰函数的方案只适用于统计函数的运行耗时,如果有代码块耗时统计的需求就不能用了,这种情况下可以使用 with 语句自动管理上下文。
<div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Nach dem Login kopieren</div></div>
<div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Nach dem Login kopieren</div></div>
通过实现 enter 和 exit 函数可以在进入和退出上下文时进行一些自定义动作,例如连接或断开数据库、打开或 关闭文件、记录开始或结束时间等,例如:我们用来统计函数块的执行时间。
with语句不仅可以统计代码块的执行时间,也可以统计函数的执行时间,还可以统计多个函数的执行时间之和,相比装饰器来说对代码的入侵性比较大,不易于修改,好处是使用起来比较灵活,不用写过多的重复代码。
<div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Nach dem Login kopieren</div></div>
rrree
#🎜🎜##🎜🎜#3. Verwenden Sie timeit.timeit ()#🎜🎜##🎜🎜#rrree
#🎜 🎜##🎜🎜#4. Dekoratorstatistiken verwenden#🎜🎜##🎜🎜#Im eigentlichen Projektcode können Sie den Dekorator verwenden, um die Laufzeit der Funktion bequem zu zählen. Der Vorteil der Verwendung von Dekoratoren zum Zählen der Funktionsausführungszeit besteht darin, dass sie die Funktion weniger beeinträchtigen und einfach zu schreiben und zu ändern sind. #🎜🎜##🎜🎜#Das Dekorator-Funktionsschema eignet sich nur zum Zählen der Laufzeit der Funktion. Wenn eine zeitaufwändige Statistik von Codeblöcken erforderlich ist, kann es nicht verwendet werden Verwenden Sie die with-Anweisung, um den Kontext automatisch zu verwalten. #🎜🎜#rrreee
#🎜🎜#rrree
#🎜🎜##🎜🎜#5. Mit Anweisungsstatistiken#🎜🎜##🎜🎜#Durch die Implementierung der Enter- und Exit-Funktionen können Sie beim Betreten und Verlassen des Kontos einige benutzerdefinierte Aktionen ausführen Kontext: Verbinden oder trennen Sie die Verbindung zur Datenbank, öffnen oder schließen Sie Dateien, zeichnen Sie die Start- oder Endzeit auf usw. Wir verwenden es beispielsweise, um die Ausführungszeit von Funktionsblöcken zu zählen. #🎜🎜##🎜🎜#Die with-Anweisung kann nicht nur die Ausführungszeit von Codeblöcken zählen, sondern auch die Summe der Ausführungszeiten mehrerer Funktionen Es ist relativ groß und schwierig zu ändern. Der Vorteil besteht darin, dass es flexibler zu verwenden ist und nicht zu viel wiederholten Code schreiben muss. #🎜🎜##🎜🎜#rrreee
#🎜🎜#Das obige ist der detaillierte Inhalt vonWie berechnet man die Ausführungszeit einer Funktion in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!