1

以下のコードはかなり一般的です。最終的な状態では、いくつかの操作 (シリアル ストリームからのデータのサンプリングなど) を実行しますが、現在の私の目標は、ループ構造を最適化してできるだけ速く実行することです。

現在、if ステートメントをトリップする前に最大頻度が 100 ~ 140 になっています。

これを実行するより効率的な方法はありますか?

注: while ループが本質的に空であることはわかっています。もちろん、実行速度の制限要因は、その中で呼び出す関数です。私が保証しようとしているのは、while ループ内のコードが可能な限り効率的に実行されていることです。

import time
frequency = float(raw_input("enter sampling frequency in Hz: "))

zero_time=time.time()
i=0

try:
    while True:
        sample_start_time=time.time()
        print 'sample',i, 'taken at', sample_start_time-zero_time
        i+=1
        sample_end_time=time.time()
        if 1/frequency-(sample_end_time-sample_start_time)<0:
            print "sampling frequency is too large...closing"
            break
        time.sleep(1/frequency-(sample_end_time-sample_start_time))
except KeyboardInterrupt:
    pass
4

3 に答える 3

4

コメントにあるように、この質問は空のループでは意味がありませんが、役立つ可能性のあるいくつかの事柄を以下に示します (重要度の高い順に大まかに並べています)。

  1. printループからステートメントを削除します。これはおそらく、あなたが現在行っている最も高価なものです。
  2. 代替タイマーを調査します。最高のパフォーマンスを提供しない可能性があり、time.timeモジュールにはいくつかの代替手段があります。time.sleeptimeit
  3. 1/frequency繰り返し行うのではなく、事前にタイマーの時間を計算してください。
  4. ループごとに 2 回ではなく、時間の差 (およびその差と期間の差) を 1 回だけ計算します。

実際の作業ケースをテストしたくない場合でも、空の関数の呼び出しをループに入れて、関数呼び出しのオーバーヘッド コストを確認することができます。上記のリストの 3 と 4 よりも時間がかかる可能性があります。

于 2012-11-10T20:16:40.693 に答える
3

はい、「while ループ」は可能な限り効率的に実行されています。以下よりも効率的な while ループを作成することはできません。

while True:
    # doStuff
于 2012-11-10T20:12:12.390 に答える
3
from time import time, sleep
frequency = float(raw_input("enter sampling frequency in Hz: "))
target_freq = 1/frequency

try:
    sampling_rate = target_freq
    while sampling_rate >= target_freq:
        sample_start_time = time()
        # maybe do some stuff here
        sample_end_time = time()
        time_diff = sample_end_time - sample_start_time
        if time_diff < target_freq:
            sleep(target_freq - time_diff)
except KeyboardInterrupt:
    pass

Pythonパフォーマンスのヒント ページ、特にドットの回避に関するセクションをご覧ください。

于 2012-11-10T20:34:44.160 に答える