จะวัดเวลาระหว่างบรรทัดของโค้ดใน python ได้อย่างไร?


98

ดังนั้นใน Java เราสามารถทำวิธีการวัดเวลาที่ฟังก์ชันดำเนินการได้

แต่มันทำได้อย่างไรใน python? ในการวัดเวลาเริ่มต้นและเวลาสิ้นสุดระหว่างบรรทัดของรหัส? สิ่งที่ทำสิ่งนี้:

import some_time_library

starttime = some_time_library.some_module()
code_tobe_measured() 
endtime = some_time_library.some_module()

time_taken = endtime - starttime

คำตอบ:


150

หากคุณต้องการวัดเวลา CPU สามารถใช้time.process_time()สำหรับ Python 3.3 ขึ้นไป:

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

สายแรกจะเปิดตัวจับเวลาและสายที่สองจะบอกคุณว่าเวลาผ่านไปกี่วินาที

นอกจากนี้ยังมีฟังก์ชั่นtime.clock()แต่เลิกใช้งานตั้งแต่ Python 3.3และจะถูกลบออกใน Python 3.8

มีเครื่องมือสร้างโปรไฟล์ที่ดีกว่าเช่นtimeitและprofileอย่างไรก็ตาม time.process_time () จะวัดเวลาของ CPU และนี่คือสิ่งที่คุณกำลังถาม

time.time()หากคุณต้องการที่จะวัดเวลาของนาฬิกาผนังแทนการใช้งาน


52
นี่ไม่ใช่วิธีที่คุณใช้time.clock()และtime.clock()วัดเวลา CPU บน Unix แต่เป็นเวลาติดผนังบน Windows ควรใช้ในtime.time()กรณีที่พฤติกรรมไม่แตกต่างกันไปตาม OS stackoverflow.com/questions/85451/…
ทิม

4
สังเกตุดีๆ @ ทิม. อย่างไรก็ตามอีกโพสต์หนึ่งในคำถามเดียวกันจะเสนอราคา python doc ใน time.clock () ว่า "นี่คือฟังก์ชันที่จะใช้สำหรับการเปรียบเทียบ Python หรืออัลกอริทึมการจับเวลา" ฉันเดาว่ามันจะเข้ากับคำถามที่คุณต้องการวัดจริงๆ
Yevgen Yampolskiy

1
สิ่งที่แย่มากเกี่ยวกับ time.time () คือมันได้รับผลกระทบจากการซิงโครไนซ์เวลา ntpdate เป็นต้นฉันจะบอกว่า time.clock () จะเป็นทางเลือกเดียวที่เชื่อถือได้เพราะเหตุนี้
www.jensolsson.se

4
DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
ismailarilik

2
อืม ... ไม่แน่ใจว่าฉันทำอะไรผิด ฉันแทนที่# your code hereด้วยtime.sleep(10)และได้ 0.0 วินาที การเพิ่มfor i in range(10000):/passผลลัพธ์เดียวกัน ไม่ว่าในกรณีใดก็ตามที่ฉันพยายามtime.process_time()จะส่งคืนตัวเลขเดิมเสมอ ผมคาดว่าผลการใช้time.perf_counter()แม้ว่า
biscuit314

56

คุณยังสามารถใช้timeไลบรารี:

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')

1
@Hayat - วิธีนี้ส่งคืนเวลาเป็นตัวเลขทศนิยมที่แสดงเป็นวินาทีนับตั้งแต่ยุคใน UTC [ docs.python.org/3/library/time.html]
Anumoy Sutradhar

@AnumoySutradhar ไม่ได้จริงๆเนื่องจากมันแทนที่ยุคจากยุคคุณจะได้รับความแตกต่างของเวลาระหว่างสองครั้ง
Nasta

28

ด้วยความช่วยเหลือของคลาสอำนวยความสะดวกขนาดเล็กคุณสามารถวัดเวลาที่ใช้ในเส้นเยื้องได้ดังนี้:

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...

ซึ่งจะแสดงสิ่งต่อไปนี้หลังจากบรรทัดที่เยื้องเสร็จสิ้นการดำเนินการ:

Code block took: x.xxx ms

UPDATE:ตอนนี้คุณจะได้รับการเรียนด้วยแล้วpip install linetimer from linetimer import CodeTimerดูโครงการ GitHubนี้

รหัสสำหรับชั้นเรียนข้างต้น:

import timeit

class CodeTimer:
    def __init__(self, name=None):
        self.name = " '"  + name + "'" if name else ''

    def __enter__(self):
        self.start = timeit.default_timer()

    def __exit__(self, exc_type, exc_value, traceback):
        self.took = (timeit.default_timer() - self.start) * 1000.0
        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')

จากนั้นคุณสามารถตั้งชื่อบล็อกรหัสที่คุณต้องการวัดได้:

with CodeTimer('loop 1'):
   for i in range(100000):
      pass

with CodeTimer('loop 2'):
   for i in range(100000):
      pass

Code block 'loop 1' took: 4.991 ms
Code block 'loop 2' took: 3.666 ms

และทำรัง :

with CodeTimer('Outer'):
   for i in range(100000):
      pass

   with CodeTimer('Inner'):
      for i in range(100000):
         pass

   for i in range(100000):
      pass

Code block 'Inner' took: 2.382 ms
Code block 'Outer' took: 10.466 ms

เกี่ยวกับtimeit.default_timer()มันใช้ตัวจับเวลาที่ดีที่สุดตามเวอร์ชัน OS และ Python ดูคำตอบนี้


9

ฉันชอบตรวจสอบเวลาในรูปแบบชั่วโมงนาทีและวินาที (% H:% M:% S) เสมอ:

from datetime import datetime
start = datetime.now()
# your code
end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 

เอาต์พุต:

Time:  0:00:00.000019

3

ฉันกำลังมองหาวิธีส่งออกเวลาที่ฟอร์แมตด้วยโค้ดขั้นต่ำดังนั้นนี่คือวิธีแก้ปัญหาของฉัน หลายคนใช้ Pandas อยู่แล้วดังนั้นในบางกรณีอาจช่วยประหยัดจากการนำเข้าไลบรารีเพิ่มเติม

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)

เอาท์พุต:

0 days 00:05:32.541600

ฉันขอแนะนำให้ใช้สิ่งนี้หากความแม่นยำของเวลาไม่สำคัญที่สุดมิฉะนั้นให้ใช้timeไลบรารี:

%timeit pd.Timestamp.now() เอาต์พุต 3.29 µs ± 214 ns ต่อลูป

%timeit time.time() เอาต์พุต 154 ns ± 13.3 ns ต่อลูป



1

การใส่รหัสในฟังก์ชันแล้วใช้มัณฑนากรเพื่อกำหนดเวลาก็เป็นอีกทางเลือกหนึ่ง ( ที่มา ) ข้อดีของวิธีนี้คือคุณกำหนดตัวจับเวลาหนึ่งครั้งและใช้กับบรรทัดเพิ่มเติมง่ายๆสำหรับทุกฟังก์ชัน

ขั้นแรกกำหนดtimerมัณฑนากร:

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
        return value

    return wrapper

จากนั้นใช้มัณฑนากรในขณะที่กำหนดฟังก์ชัน:

@timer
def doubled_and_add(num):
    res = sum([i*2 for i in range(num)])
    print("Result : {}".format(res))

มาลองกัน:

doubled_and_add(100000)
doubled_and_add(1000000)

เอาท์พุต:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs

หมายเหตุ: ฉันไม่แน่ใจว่าทำไมถึงใช้time.perf_counterแทนtime.timeไฟล์. ยินดีรับฟังความคิดเห็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.