日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python计算执行时间的函数_[python] 统计函数运行时间

發布時間:2025/3/8 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python计算执行时间的函数_[python] 统计函数运行时间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一種:

import time

def time_me(fn): #fn 是要修飾/修改 的函數

def _wrapper(*args, **kwargs): #這個 _wrapper(*args, **kwargs) 則代指fn, *args 代表一般變量參數, **kwargs代表 字典,哈希等參數

start = time.perf_counter()

fn(*args, **kwargs)

print ("%s cost %s second"%(fn.__name__, time.perf_counter() - start))

return _wrapper

#這個裝飾器可以在方便地統計函數運行的耗時。

#用來分析腳本的性能是最好不過了。

#這樣用:

@time_me() 這里 沒有指定

def test(x, y):

time.sleep(0.1)

@time_me()

def test2(x):

time.sleep(0.2)

test(1, 2)

test2(2)

第二種:

import time

import functools

def time_me(info="used"):

def _time_me(fn):

@functools.wraps(fn) #轉化為輸入函數

def _wrapper(*args, **kwargs): #*args, **kwargs 代指所有 輸入函數的參數

start = time.perf_counter()

fn(*args, **kwargs)

print("%s %s %s"%(fn.__name__, info, time.perf_counter() - start), "second")

return _wrapper

return _time_me

#應用

@time_me() #添加修飾器,就是函數嵌套了函數,中間加了一些功能和執行內容,而不需要 修改 test() 函數的內容

def test(x, y):

time.sleep(0.1)

@time_me("cost") #添加修飾器

def test2(x):

time.sleep(0.2)

test(1, 2)

test2(2)

image.png

第三種改進版:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from __future__ import division

from __future__ import unicode_literals

import sys,time,datetime,functools

#info

__author__ = ''

__email__ = 'xxx@xxx.com'

__version__ = '0.0.1'

__status__ = 'Dev'

def time_me(info="used"):

def _time_me(fn):

@functools.wraps(fn) #轉化為輸入函數

def _wrapper(*args, **kwargs): #*args, **kwargs 代指所有 輸入函數的參數

if sys.version[0]=="3":

start = time.perf_counter()

else:

start = time.clock()

fn(*args, **kwargs)

if sys.version[0]=="3":

end = time.perf_counter()

else:

end = time.clock()

print("%s %s %s"%(fn.__name__, info, str(datetime.timedelta(seconds = end - start))))

return _wrapper

return _time_me

#應用

@time_me() #添加修飾器,就是函數嵌套了函數,中間加了一些功能和執行內容,而不需要 修改 test() 函數的內容

def test(x, y):

time.sleep(0.3)

@time_me("cost") #添加修飾器,給個參數cost

def test2(x):

time.sleep(0.4)

test(1, 2)

test2(2)

輸出為:

image.png

第四種 在實際應用時 發現會報錯

TypeError: cannot unpack non-iterable NoneType object

自己用在某個函數上,這個函數輸入和返回都不止 一個參數

@time_me()

def bam2fa(bam,lst,fz=1000,rz=100,pb=0.66,if="ins",if2="hr",sf=False):

pass

return list, dict, list

查詢后發現 原因是:

TypeError: cannot unpack non-iterable NoneType object

報錯的原因是函數返回值得數量不一致,查看函數返回值數量和調用函數時接收返回值的數量是不是一致,修改一致即可

發覺是是自己對裝飾器理解不到位,逐

參考了這里,發現 之前的例子里少了 return func(*args, **kwargs) 返回這個原始函數func

Python 函數裝飾器

image.png

看完了這篇才明白

如何理解Python裝飾器?

如下圖中

fn(*args, **kwargs) 放在了 獲取時間的中間,但是我的函數是有返回值的

image.png

完善版本(支持具有返回值的函數)

8881910.png

'''

import sys,time,datetime,functools,logging

#logging 用于輸出日志

def main():

#logging 設置

LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s %(pathname)s %(message)s "#配置輸出日志格式

DATE_FORMAT = '%Y-%m-%d %H:%M:%S' #配置輸出時間的格式,注意月份和天數不要搞亂了

logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT,datefmt = DATE_FORMAT,filename=r"logging.log" )

'''

def time_me(info="used"):

def _time_me(func):

if sys.version[0]=="3": #獲得python版本號,截取第一個字符,2.7就是2 ,3.8就是3

start = time.perf_counter() #python3 中使用perf_counter()

else:

start = time.clock() #python2 中使用clock()

@functools.wraps(func) #效果是保持當前裝飾器去裝飾的函數的 __name__ 的值不變;

#函數的函數名即 __name__默認被裝飾器改變為_wrapper,但是當存在多個修飾器時,重名會發生錯誤,

def _wrapper(*args, **kwargs): #*args, **kwargs 代指所有 輸入函數的參數

return func(*args, **kwargs) #這里等于執行了一次這個函數

if sys.version[0]=="3": #獲得python版本號,截取第一個字符,2.7就是2 ,3.8就是3

end = time.perf_counter()

else:

end = time.clock()

#logging.info("%s %s %s\n"%(func.__name__, info, str(datetime.timedelta(seconds = end - start)))) #這里可以替換 logging 日志,func.__name__ 是該函數的名字,也可以自己在函數中設置 __name__="xxx"

print("%s %s %s"%(fn.__name__, info, str(datetime.timedelta(seconds = end - start))))

return _wrapper

return _time_me

args表示任何多個無名參數,它是一個tuple;kwargs表示關鍵字參數,它是一個dict。并且同時使用args和kwargs時,必須args參數列要在*kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )這樣調用的話,會提示語法錯誤“SyntaxError: non-keyword arg after keyword arg”。

獲得的啟示:編寫函數時,參數中字典類型的放在后面 func() 的后面 ,如 func( arg,tuple,list,dict)

總結

以上是生活随笔為你收集整理的python计算执行时间的函数_[python] 统计函数运行时间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。