2

の時間を測定しようとしていますがraw_queries(...)、これまでのところ失敗しています。timeitモジュールを使用する必要があることがわかりました。問題は、環境から関数に引数を渡すことができない(=方法がわからない)ことです。

重要な注意:を呼び出す前に、 (環境の初期化)raw_queriesを実行する必要があります。phase2()

補足:コードはPython3です。

def raw_queries(queries, nlp):
    """ Submit queries without getting visual response """

    for q in queries:
        nlp.query(q)

def evaluate_queries(queries, nlp):
    """ Measure the time that the queries need to return their results """

    t = Timer("raw_queries(queries, nlp)", "?????")
    print(t.timeit())

def phase2():
    """ Load dictionary to memory and subsequently submit queries """

    # prepare Linguistic Processor to submit it the queries
    all_files = get_files()
    b = LinguisticProcessor(all_files)
    b.loadDictionary()

    # load the queries
    queries_file = 'queries.txt'
    queries = load_queries(queries_file)

if __name__ == '__main__':
    phase2()

助けてくれてありがとう。

更新:phase2()の2番目の引数を使用して呼び出すことができますTimer(queries, nlp)問題は、環境からの議論が必要なことです。

更新:unutbuの助けを借りたこれまでの最良の解決策(変更されたもののみ):

def evaluate_queries():
    """ Measure the time that the queries need to return their results """

    t = Timer("main.raw_queries(queries, nlp)", "import main;\
        (queries,nlp)=main.phase2()")

    sf = 'Execution time: {} ms'
    print(sf.format(t.timeit(number=1000)))


def phase2():
    ...

    return queries, b


def main():
    evaluate_queries()

if __name__ == '__main__':
    main()
4

5 に答える 5

6

まず、 time モジュールを時間関数に使用しないでください。間違った結論を導きやすい。例については、 timeit とタイミング デコレータを参照してください。

関数呼び出しの時間を計測する最も簡単な方法は、IPython の %timeit コマンドを使用することです。そこでは、インタラクティブな IPython セッションを開始し、 を呼び出しphase2()、 を定義queriesしてから実行するだけです

%timeit raw_queries(queries,nlp)

timeit を使用するために私が知っている 2 番目に簡単な方法は、コマンドラインから呼び出すことです。

python -mtimeit -s"import test; queries=test.phase2()" "test.raw_queries(queries)"

(上記のコマンドでは、スクリプトが呼び出されていると想定していますtest.py)

ここのイディオムは

python -mtimeit -s"SETUP_COMMANDS" "COMMAND_TO_BE_TIMED"

関数呼び出しに渡すことができるようにqueriesするには、変数を定義する必要があります。投稿したコードでは で定義されていますが、ローカルでのみ定義されています。したがって、グローバル変数としてセットアップするには、 have returnのようなことをする必要があります:raw_queriesqueriesqueriesphase2()queriesphase2queries

def phase2():
    ...
    return queries

この方法を台無しにしたくない場合はphase2、ダミー関数を作成します。

def phase3():
    # Do stuff like phase2() but return queries
    return queries
于 2009-12-27T20:13:11.753 に答える
2

カスタムタイマー機能が解決策になる場合があります。

import time

def timer(fun,*args):
    start = time.time()
    ret = fun(*args)
    end = time.time()
    return (ret, end-start)

このように使用する:

>>> from math import sin
>>> timer(sin, 0.5)
(0.47942553860420301, 6.9141387939453125e-06)

それはsin戻ってきて数秒0.479...かかったことを意味します。6.9e-6信頼できる数値を取得したい場合は、関数が十分に長く実行されることを確認してください(上記の例のように)。

于 2009-12-27T19:30:58.563 に答える
2

通常、timeitを使用します。

例はここここにあります。

また、注意:

デフォルトでは、timeit() は、タイミング中にガベージ コレクションを一時的にオフにします。このアプローチの利点は、独立したタイミングを比較しやすくすることです。この欠点は、GC が測定される関数のパフォーマンスの重要な要素である可能性があることです。

または、timeモジュールを使用して独自のカスタム タイマーを作成することもできます。

カスタム タイマーを使用する場合は、Windows では time.clock() を使用し、他のプラットフォームでは time.time() を使用する必要があることに注意してください。(時間は内部で選択)

import sys
import time

# choose timer to use
if sys.platform.startswith('win'):
    default_timer = time.clock
else:
    default_timer = time.time

start = default_timer()
# do something
finish = default_timer()
elapsed = (finish - start)
于 2009-12-27T19:48:54.177 に答える
1

これについてはよくわかりません。使用したことはありませんが、読んだ内容からすると、次のようになります。

....
t = Timer("raw_queries(queries, nlp)", "from __main__ import raw_queries")
print t.timeit()

これはhttp://docs.python.org/library/timeit.htmlから取得しました(これが役立つ場合)。

于 2009-12-27T19:23:46.193 に答える
0

あなたはそうは言いませんが、ひょっとしてコードを高速化しようとしているのですか? もしそうなら、特定のルーチンに集中するのではなく、時間を計ることをお勧めします. 数値を取得しても、何を修正すればよいかはわかりません。IDE の下でプログラムを数回一時停止し、コール スタックを含むその状態を調べることができれば、時間がかかっている原因とその理由がわかります。これがどのように、そしてなぜ機能するかについての簡単な説明を提供するリンクがあります。*

※リンク先をたどると、前の回答ページの一番下まで行かなければならない場合があります。SOは、回答へのリンクをたどるのに問題があります。

于 2009-12-28T19:46:32.260 に答える