2012-02-15 9 views
1

私のコンピュータで何回行うことができるのか計算したいcounter += 1 1秒。 counter += 1よりもかなり高価になることがありアルゴリズムのタイミングはPython

from time import time 

counter = 0 
startTime = time() 

while time() - startTime < 1: 
    counter += 1 

print counter 

問題があるtime() - startTime < 1:単純なアプローチは以下の通りです。

アルゴリズムの「クリーン」な1秒サンプルを作成する方法はありますか?

答えて

8

アルゴリズムの時間を決める一般的な方法は逆です:固定された回数の反復を使用して、それらを終了するのにかかる時間を測定します。このようなタイミングを実行する最も良い方法は、timeitモジュールです。

print timeit.timeit("counter += 1", "counter = 0", number=100000000) 

タイミングcounter += 1はしかし、むしろ無意味と思われることに注意してください。あなたは何を達成したいですか?

+0

ええ、私は知っています。私は、コンピュータが何秒間にどれくらい多くの操作を処理できるかについて世界的に関心がありますが、これはやや異なる問題です。 – Randomblue

+2

@Randomblue: "1秒あたりの操作数"は概念を明確に定義するものではありません。 Pythonスクリプトは確かにプロセッサの速度をテストする正しい方法ではありません。 –

+0

@Randomblueもしあなたが本当に逆にしたいのであれば、1時間以内に何回行うことができるかを測定し、それを3600で割ります。 – soulcheck

0

私はtime()ライブラリで作業したことがありませんが、そのコードによれば、秒数と見なします。したがって、ctrl + Cの後に/秒の計算を行うとどうなりますか?このようなものになるだろう:

もちろん
#! /usr/bin/env python 

from time import time 
import signal 
import sys 

#The ctrl+C interruption function: 
def signal_handler(signal, frame): 
    counts_per_sec = counter/(time()-startTime) 
    print counts_per_sec 
    exit(0) 
signal.signal(signal.SIGINT, signal_handler) 

counter = 0 
startTime = time() 
while 1: 
    counter = counter + 1 

、それが原因で時間処理した最後の秒の間で渡されると、割り込み信号の正確で文句を言わない、しかし、あなたが実行中のスクリプトを残して、より多くの時間、より正確なことはしますbe:

1

代わりに時間を推測してみませんか?

from datetime import datetime 

def operation(): 
    counter = 0 
    tbeg = datetime.utcnow() 
    for _ in range(10**6): 
     counter += 1 
    td = datetime.utcnow() - tbeg 
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/10.0**6 

def timer(n): 
    stack = [] 
    for _ in range(n):   
     stack.append(operation()) # units of musec/increment 
    print sum(stack)/len(stack) 

if __name__ == "__main__": 
    timer(10) 

を実行して、増分あたりの平均経過マイクロ秒を取得することができます。私は0.09(おそらく非常に不正確かもしれない)を得る。今、私は0.09マイクロ秒で1つの増分を作ることができれば、1秒で約11258992を作ることができるということを推論するのは簡単な操作です。

私は測定が非常に不正確だと思いますが、賢明な近似ですか?

関連する問題