2011-12-08 1 views
2

で実行時間機能を取得します。私は別の関数の時間を取得するために、この仕事関数を作成するのpython

def get_execution_time(function, args, numberOfExecTime=1): 
    """Return the execution time of a function in seconds. 

    """ 

    return round(Timer(partial(function, args)).timeit(numberOfExecTime), 5) 

私は問題があるところで:私は関数に複数の入力(引数)を与えることはできません時限を付ける。 どうすればいいですか?部分的に正しいツールですか?

私はデコレータを試しましたが、私はいくつかの統計を行うために必要な時間を保存できません。

答えて

3

複数の引数を渡すことができます。argsは、渡す引数を含むタプルにする必要があります。

argsの代わりに*argsを渡すことができます。

(あなたもあなたの方法にkwargsからを渡す必要がある場合には、get_execution_timeに別の引数kwargsを持っているし、あなたのfunction**kwargsを渡す)

def get_execution_time(function, args=(), kwargs ={}, numberOfExecTime=1): 
    return round(Timer(partial(function, *args, **kwargs)).timeit(numberOfExecTime), 5) 
+0

これは既存のコードを使用した場合の最良の回答です。しかし、@ KL-7は、受信したデータをより細かく制御したいときは、より表現力があります。 – Edwin

+0

私はKL-7(私が投稿したものに加えて)と同じ提案を投稿することをためらったが、私の目には、この機能の呼び出しがより簡単なので、最終的に投稿することを決定したバージョンが、渡された引数のどちらが関数に渡され、どちらがメソッド自体の引数であるかのあいまいさはありません。 – gecco

+0

それは、私がそれ以上の表現力を持っていたということです。質問者が何を望んでいるかに依存しているので、どの答えが一番良いかは決して言いませんでした。 – Edwin

0

argsは、引数のlistある場合は*argsでそれを拡張することができます:

return round(Timer(partial(function, args)).timeit(numberOfExecTime), 5) 
4

あなたはあなたがそのようにそれを行うことができますnumberOfExecTime引数のデフォルト値を持っている能力を犠牲にすることができた場合:

from timeit import Timer 
from functools import partial 

def get_execution_time(function, numberOfExecTime, *args, **kwargs): 
    """Return the execution time of a function in seconds.""" 
    return round(Timer(partial(function, *args, **kwargs)) 
       .timeit(numberOfExecTime), 5) 

def foo(a, b, c = 12): 
    print a, b, c 

get_execution_time(foo, 1, 3, 4, c = 14) 

それとも、そのようにそれを行うと、まだnumberOfExecTimeのデフォルト値を持つことができます。

from timeit import Timer 
from functools import partial 

def get_execution_time(function, *args, **kwargs): 
    """Return the execution time of a function in seconds.""" 
    numberOfExecTime = kwargs.pop('numberOfExecTime', 1) 
    return round(Timer(partial(function, *args, **kwargs)) 
       .timeit(numberOfExecTime), 5) 

def foo(a, b, c = 1): 
    print a, b, c 

get_execution_time(foo, 1, 2, c = 2) 
# => 1 2 2 

get_execution_time(foo, 4, 5, c = 3, numberOfExecTime = 2) 
# => 4 5 3 
# => 4 5 3 
+0

デフォルトを犠牲にする必要はありません。引数リストからそれを省略して、最初の行に 'numberOfExecTime' in kwargs else 1'があれば 'numberOfExecTime = kwargs ['numberOfExecTime']を加えてください。 – Wilduck

+0

これは、ほとんどの場合、第2の変種で 'pop'メソッドをデフォルト値で使っていたと思います。 –

+0

Yikes、正直言って、私はこれまでも読んでいませんでした。 – Wilduck

2

私はタイミングデコレータを使用します。

import time 

def timeit(f): 

    def timed(*args, **kw): 

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

     print 'func:%r args:[%r, %r] took: %2.4f sec' % \ 
      (f.__name__, args, kw, te-ts) 
     return result 

    return timed 

注釈を使用すると簡単に注釈を使用できます。

@timeit 
def compute_magic(n): 
    #function definition 
    #.... 

時間をかけたい機能を再度エイリアスします。

compute_magic = timeit(compute_magic) 

ここに私のブログ記事があります。 http://blog.mattalcock.com/2013/2/24/timing-python-code/

関連する問題