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)

73edd03b914a

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)

輸出為:

73edd03b914a

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 函數裝飾器

73edd03b914a

image.png

看完了這篇才明白

如何理解Python裝飾器?

如下圖中

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

73edd03b914a

image.png

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

73edd03b914a

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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533694.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533694.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

arthas 排查內存溢出_Java 應用線上問題排查思路、常用工具小結

前言本文總結了一些常見的線上應急現象和對應排查步驟和工具。分享的主要目的是想讓對線上問題接觸少的同學有個預先認知,免得在遇到實際問題時手忙腳亂。畢竟作者自己也是從手忙腳亂時走過來的。只不過這里先提示一下。在線上應急過程中要記住,只有一個…

計算機個性化定制服務課題,服務網絡的構建與面向增量式需求的動態定制方法-計算機科學與技術專業論文.docx...

服務網絡的構建與面向增量式需求的動態定制方法-計算機科學與技術專業論文Classified Index: TP315 U.D.C: 681.3Dissertation for the Master’s Degree in EngineeringSERVICE NETWORK CONSTRUCTION AND DYNAMIC CUSTOMIZATION METHOD FOR SUBJECTIVE CHANGES OF CUSTOMER RE…

flutter listview 滾動到指定位置_Flutter 布局原理及實戰

1. Flutter UI架構Flutter將視圖數據抽象成為三個部分,即Widget樹、Element樹和RenderObject樹。Widget樹:控件的配置信息,不涉及渲染,更新代價極低。RenderObject樹:真正的UI渲染樹,負責渲染UI&#xff0c…

計算機的屏幕約是16平方分米嗎,小明的臥室有16平方分米對不對

小明的臥室有16平方分米對不對不對,應該是16平方米不對錯! 16平方分米太小了不對,那么小怎么可能住人。不正確應該是16平方米xiao ming de wo shi you 1 6 ping fang fen mi dui bu dui32平方分米涂上每平方分米的96克油漆,需要幾克32平方分米需要油漆30…

python引用傳遞_python 是值傳遞還是引用傳遞 知乎

展開全部 那要看數據類型了,21135261int,float,str這種就是傳值,list,dict,類的實例,自定義對象都是穿4102引用。 下面1653是示例代碼:def change(int1,float1,str1,dict1,obj1,list…

雷神開機logo更改_國產外星人雷神再發新品 911MT逐影者RTX2060光追游戲本評測

隨著NVIDIA發布了筆記本20系顯卡之后,宣示著全民進入了“RTX光線追蹤時代”,各種新款的游戲也紛紛宣布支持“光線追蹤”技術來吸引更多的玩家,似乎現在游戲本上沒有個“RTX”貼紙就已經不好意思跟別人打招呼了。說到2019年的RTX新品&#xff…

AJAX框架衣柜內部布局,?最合理的衣柜內部布局解析,3大細節不容小覷

時常有業主或者朋友問小輕,最合理的衣柜內部布局應該是怎樣的,確實這對于非業內人士一般都是不太清楚的,即使有的朋友已經有了豐富的生活經驗,甚至是業內人士也不一定對此完全了解。那么到底最合理的衣柜內部布局是怎樣的呢&#…

python爬取數據保存為csv時生成編號_將爬取到到數據以CSV格式存儲

CSV文件存儲 CSV,全稱為Comma-Separated Values,中文可以叫做逗號分隔值或字符分隔值,其文件以純文本形式存儲表格數據。該文件是一個字符序列,可以由任意數目的記錄組成,記錄間以某種換行符分隔。每條記錄由字段組成&…

博達3956交換機配置手冊_網絡設備維保淺談之交換機維保

隨著信息化的飛速發展,交換機作為信息流通的承載者,是應用最為廣泛的網絡設備之一,其作用不言而喻。因此,在日產使用中,要注意交換機這種核心的設備的維護與保養,以免引發故障。交換機運維需要注意哪些問題…

java cas原理_Java并發之原子變量及CAS算法-上篇

Java并發之原子變量及CAS算法-上篇編輯?概述本文主要講在Java并發編程的時候,如果保證變量的原子性,在JDK提供的類中是怎么保證變量原子性的呢?。對應Java中的包是:java.util.concurrent.atomic包下。因為涉及到了CAS算法&#x…

node ajax validator,使用validator.js對字符串數據進行驗證

validator.js是一個對字符串進行數據驗證和過濾的工具庫,同時支持Node端和瀏覽器端,github地址是https://github.com/chriso/validator.js主要API如下:驗證APIcontains(str, seed)驗證str中是否含有seedequals(str, comparison)驗證是否相等i…

css span 右端對齊_CSS標準文檔流

web頁面的制作,是個“流”,像水流一樣,必須從上往下,一點點的編織,不像畫畫,可以這個地方畫一個,另一個地方畫一個,隨意而為。標準文檔流的一些微觀現象1. 空白折疊現象1)標簽與標簽…

composer升級_Composer 使用姿勢與 Lumen 升級指南

Composer 使用姿勢這里主要說說 composer.json 和 composer.lock 文件的作用。composer.jsoncomposer.json 文件包含了項目的依賴和其它的一些元數據,使用 JSON format 編寫。當初次調用 composer install 時,Composer 會根據 composer.json 文件&#x…

服務器間傳文件$d,基于OpenSSH+WinSCP完成Windows服務器之間的文件傳輸

背景經常會遇到在不同服務器之間傳輸文件,Linux和Linux之間用命令rsync, windows和linux之間普遍是有圖形化界面的ftp軟件,老黃平時用的比較多的是FileZilla。Windows和Windows之間的話,90%都是在一臺機器復制,到另一臺…

dbgrideh 為什么只一行_Mysql性能優化:為什么count(*)這么慢?

導讀在開發中一定會用到統計一張表的行數,比如一個交易系統,老板會讓你每天生成一個報表,這些統計信息少不了sql中的count函數。但是隨著記錄越來越多,查詢的速度會越來越慢,為什么會這樣呢?Mysql內部到底是…

jmeter 高并發測試報告_JMeter分布式測試

一、為什么要使用分布式測試按照一般的壓力機配置,jmeter的GUI模式下(Windows),最多支持300左右的模擬請求線程,再大的話,容易造成卡頓、無響應等情況,這是限于jmeter其本身的機制和硬件配置。有時候為了盡量模擬業務場…

登陸攔截攔截ajax,過濾器實現登錄攔截需要注意的問題(AJAX請求的處理)

1.問題描述:最近自己在寫demo時遇到一個問題,在ajax請求時用Filter做登錄攔截,結果頁面不跳轉(Ajax是不能做轉發和重定向的)、、、、最終的最終在同事zt的提示下,恍然大悟,雖然很基本的問題,但也糾結了好久…

半圓陰影_六年級數學:怎么求陰影部分面積?正方形與半圓,割補法常考題

歡迎您來到方老師數學課堂,請點擊上方藍色字體,添加關注。所有的視頻內容,全部免費,請大家放心關注,放心訂閱。六年級數學:怎么求陰影部分面積?正方形與半圓,割補法常考題。大家先在…

c語言判斷整數_用c++編寫閏年的判斷基礎程序

其實c語言與c語言有太多共同的東西,學習過c語言再學習c語言就顯得輕而易舉。當然學過了c再去學習c語言也是有一些幫助的(但是個人不提倡先學習c在學c語言)。由于現在經常看見有關閏年的程序,風式各樣,眼花繚亂,些許凌亂&#xff0…

cat日志 搜索_大日志,看我如何對付你

在服務器接口測試中,我們經常會和各種日志打交道。一旦測試時服務端出現了問題,而單憑服務端的日志又不能發現問題原因的時候,往往開發要向我們測試人員詢問客戶端這邊的情況,希望看看我們能不能提供一些有用信息,如錯…