2014-09-21 55 views
0

我剛剛完成在python中編寫我的第一個程序,我已經將所有函數寫入單個模塊中,我只是通過給出輸入文件作爲參數並在其中工作,從命令行執行它。但是,當我給了一個大數據集,我的程序不斷運行一段時間。現在我的下一步是找到哪個功能需要更多時間在我的模塊中。我可以花費整個程序的時間,但我需要分別爲每個功能。每個函數的Python時間度量

我試圖瞭解Python中的timeit和profile模塊,但按照我的理解,他們給了一個特定函數花費的時間。有沒有辦法知道我的模塊中的每個函數所花費的時間作爲統計信息(一次全部)?

在此先感謝。

+1

請嘗試[*此*](http://stackoverflow.com/a/4299378/23771)。 – 2014-09-21 12:00:04

回答

6

在終端中,運行

python -m profile -s time file.py 

python -m cProfile -s time file.py 

第二可以更快,並且是從未惡化。

這將使類似:

Ordered by: internal time 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     39 0.132 0.003 0.139 0.004 :0(load_dynamic) 
     239 0.097 0.000 0.097 0.000 :0(loads) 
    541/1 0.083 0.000 3.556 3.556 :0(exec) 
     30 0.082 0.003 0.082 0.003 :0(statusBar) 
         ... etc ... 

左手邊將包含您的功能。

+0

我得到這些錯誤 - >文件「/usr/lib/python3.4/runpy.py」,第170行,在_run_module_as_main 「/_r/lib/python3.4/runpy.py」,第85行,在_run_code中 exec(代碼,run_globals) 「/usr/lib/python3.4/profile」文件。代碼:編譯(fp.read(),程序名,'exec')行589,在 main() 文件「/usr/lib/python3.4/profile.py」,行575,在主 代碼= ) 文件「/home/****/eclipseworkspace/abcd.py」,第20行 print'%r(%r,%r)%2.2f sec'%\ – 2014-09-21 11:26:55

+0

如果你只是運行'python file .py'? – Veedrac 2014-09-21 11:29:35

+0

另外,'python -V'是什麼意思?它應該從「Python 2」開始。 – Veedrac 2014-09-21 11:32:46

1

第一,我建議使用這個目的 .timeit提供了一種簡單的方法,以時間的Python代碼小塊profilers模塊或timeit

要分析一個函數,它接受一個參數,你可以這樣做:

import cProfile 
import re 
cProfile.run('re.compile("foo|bar")') 

你也可以使用一個Decorator像這樣的可以測量的專用方法的執行時間:

import time             

def measure_time(f): 

    def timed(*args, **kw): 
    ts = time.time() 
    result = f(*args, **kw) 
    te = time.time() 

    print '%r (%r, %r) %2.2f sec' % \ 
      (f.__name__, args, kw, te-ts) 
    return result 

return timed 

您可以使用它像這樣:

@measure_time 
    def foo(): 
     #content of function 

注意,f.__name__返回函數的名字! (在這種情況下 '富')

+0

對不起,我從來沒有這樣做過。所以,我必須在我的程序開始時添加這個measure_time函數,並在每個函數之前添加@measure_time?我對嗎? – 2014-09-21 11:18:06

+0

是否可以使用整個程序的配置文件或時間?這是否讓我花費每個函數的時間,或者我必須使用它們來查找一個函數花費的時間嗎? – 2014-09-21 11:19:38

+1

您需要在'.py'中定義函數,並使用'@ measure_time'作爲找到這些運行時的任何函數! – Kasramvd 2014-09-21 11:20:35