41

私はちょうどコードの時間を計ろうとしています。疑似コードは次のようになります。

start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."

これは Python ではどのように見えますか?

より具体的には、真夜中以降のティック数を取得するにはどうすればよいですか (または、Python がそのタイミングを整理します)。

4

6 に答える 6

34

モジュールには、time2つのタイミング関数があります:timeclocktimeこれがあなたが気にかけているものであるならば、あなたに「壁」時間を与えます。

ただし、Pythonのドキュメントにはclock、ベンチマークに使用する必要があると記載されています。clock別々のシステムでは動作が異なることに注意してください。

  • MS Windowsでは、Win32関数QueryPerformanceCounter()を使用し、「通常、マイクロ秒よりも優れた解像度」を備えています。特別な意味はありません。単なる数字です(プロセスで最初に呼び出したときにカウントを開始clockします)。
    #msウィンドウ
    t0 = time.clock()
    do_something()
    t = time.clock()-t0#tは経過した壁の秒数(浮動小数点)
  • * nixで、clockCPU時間を報告します。さて、これは異なり、おそらくあなたが望む値です。なぜなら、あなたのプログラムがCPU時間を要求する唯一のプロセスであるということはほとんどないからです(他のプロセスがない場合でも、カーネルは時々CPU時間を使用します)。したがって、この数値は通常、実時間よりも小さい¹(つまり、time.time()-t0)は、コードのベンチマークを行うときに意味があります。
    #linux
    t0 = time.clock()
    do_something()
    t = time.clock()-t0#tはCPU秒の経過(浮動小数点)

それとは別に、timeitモジュールにはTimer、利用可能な機能からベンチマークに最適なものを使用することになっているクラスがあります。

¹糸が邪魔にならない限り…</p>

²Python≥3.3:とがtime.perf_counter()ありtime.process_time()ます。perf_counterモジュールによって使用されていtimeitます。

于 2008-10-01T12:49:11.290 に答える
31

必要なのはモジュールtime()からの関数timeです:

import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."

ただし、より多くのオプションにtimeitモジュールを使用できます。

于 2008-10-01T05:27:03.413 に答える
5

最近使い始めたソリューションは次のとおりです。

class Timer:
    def __enter__(self):
        self.begin = now()

    def __exit__(self, type, value, traceback):
        print(format_delta(self.begin, now()))

次のように使用します (少なくとも Python 2.5 が必要です)。

with Timer():
    do_long_code()

コードが終了すると、Timer は実行時間を自動的に出力します。甘い!Python インタープリターで何かをすばやくベンチに入れようとしている場合、これが最も簡単な方法です。

そして、これは「now」と「format_delta」のサンプル実装ですが、好みのタイミングとフォーマット方法を自由に使用してください。

import datetime

def now():
    return datetime.datetime.now()

# Prints one of the following formats*:
# 1.58 days
# 2.98 hours
# 9.28 minutes # Not actually added yet, oops.
# 5.60 seconds
# 790 milliseconds
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms. 
def format_delta(start,end):

    # Time in microseconds
    one_day = 86400000000
    one_hour = 3600000000
    one_second = 1000000
    one_millisecond = 1000

    delta = end - start

    build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day

    days = 0
    while build_time_us > one_day:
        build_time_us -= one_day
        days += 1

    if days > 0:
        time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
    else:
        hours = 0
        while build_time_us > one_hour:
            build_time_us -= one_hour
            hours += 1
        if hours > 0:
            time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
        else:
            seconds = 0
            while build_time_us > one_second:
                build_time_us -= one_second
                seconds += 1
            if seconds > 0:
                time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
            else:
                ms = 0
                while build_time_us > one_millisecond:
                    build_time_us -= one_millisecond
                    ms += 1
                time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
    return time_str

好みの書式設定方法がある場合、またはこれらすべてを行う簡単な方法がある場合はお知らせください。

于 2012-11-09T01:05:48.867 に答える
2
import datetime

start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds

午前 0 時から:

import datetime

midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
now = datetime.datetime.now()
delta = now - midnight
print delta.seconds
于 2008-10-01T05:28:59.007 に答える
2

Pythonのtime モジュールは、浮動小数点として秒単位の時間を返す clock() 関数へのアクセスを提供します。

システムが異なれば、内部クロックの設定 (1 秒あたりのティック数) に基づいて精度も異なりますが、通常は少なくとも 20 ミリ秒未満であり、場合によっては数マイクロ秒よりも優れています。

-アダム

于 2008-10-01T05:31:01.857 に答える
0

時間を計測したいステートメントが多数ある場合は、次のようなものを使用できます。

class Ticker:
    def __init__(self):
        self.t = clock()

    def __call__(self):
        dt = clock() - self.t
        self.t = clock()
        return 1000 * dt

次に、コードは次のようになります。

tick = Ticker()
# first command
print('first took {}ms'.format(tick())
# second group of commands
print('second took {}ms'.format(tick())
# third group of commands
print('third took {}ms'.format(tick())

そうすれば、t = time()各ブロックの前後に入力する必要がなく1000 * (time() - t)、書式設定を制御できます (簡単に入力することもできTicketます)。

最小限のゲインですが、便利だと思います。

于 2016-02-27T20:51:06.233 に答える