Python time.clock () กับ time.time () ความแม่นยำหรือไม่


428

จะใช้วิธีใดในการกำหนดเวลาใน Python time.clock () หรือ time.time ()? ข้อใดให้ความแม่นยำมากกว่า

ตัวอย่างเช่น:

start = time.clock()
... do something
elapsed = (time.clock() - start)

เมื่อเทียบกับ

start = time.time()
... do something
elapsed = (time.time() - start)

32
โปรดทราบว่าตั้งแต่ Python 3.3 การใช้งานtime.clock()ไม่ได้รับการสนับสนุนและแนะนำให้ใช้perf_counter()หรือprocess_time()แทน
Cody Piersall


ดูความคิดเห็นนี้เกี่ยวกับวิธีการรวมคอร์ทั้งหมดที่ใช้โดยกระบวนการtime.clockและtime.process_timeกระบวนการลูกไม่ได้ ดูการสนทนาของความแม่นยำนี้ (แน่นอนแตกต่างกันไปตามระบบ)
สูงสุด

คำตอบ:


161

ตั้งแต่ 3.3, time.clock ()เลิกใช้แล้วและแนะนำให้ใช้time.process_time ()หรือtime.perf_counter ()แทน

ก่อนหน้านี้ใน 2.7 ตามเอกสารเวลาของโมดูล :

time.clock ()

บน Unix ให้ส่งคืนเวลาตัวประมวลผลปัจจุบันเป็นหมายเลขทศนิยมที่แสดงในหน่วยวินาที ความแม่นยำและในความเป็นจริงคำจำกัดความของความหมายของ“ เวลาตัวประมวลผล” นั้นขึ้นอยู่กับฟังก์ชัน C ในชื่อเดียวกัน แต่ในกรณีใด ๆนี่คือฟังก์ชันที่ใช้สำหรับการเปรียบเทียบ Python หรืออัลกอริธึมการกำหนดเวลา

บน Windows ฟังก์ชั่นนี้จะส่งคืนวินาทีนาฬิกาแขวนที่ผ่านไปนับตั้งแต่การโทรครั้งแรกไปที่ฟังก์ชั่นนี้เป็นหมายเลขจุดลอยตัวตามฟังก์ชั่น Win32 QueryPerformanceCounter () โดยทั่วไปความละเอียดจะดีกว่าหนึ่งไมโครวินาที

นอกจากนี้ยังมีโมดูลtimeitสำหรับการเปรียบเทียบโค้ด


4
"นี่เป็นฟังก์ชันที่ใช้สำหรับการเปรียบเทียบ Python หรืออัลกอริธึมกำหนดเวลา" <br> เอกสาร Python ดูเหมือนจะไม่ถูกต้องตามคำตอบที่ให้ไว้ที่นี่ time.clock () ไม่ใช่สิ่งที่คุณต้องการสำหรับการเปรียบเทียบ โดยเฉพาะอย่างยิ่งกับการมีอยู่ของโมดูล timeit
Corey Goldberg

1
@Corey Goldberg: คุณส่งข้อผิดพลาดเอกสารไปด้วยเหรอ? (พวกเขาหมายถึง "ใช้นาฬิกา ()มากกว่าเวลา () : แต่ใช่มันเป็นเลอะเทอะ)
smci


3
อย่างที่สามารถอ่านได้ที่นี่ดูเหมือนว่าพฤติกรรมของtime.clock()มันขึ้นอยู่กับแพลตฟอร์มและtime.process_time()ไม่ใช่ นี่คือเหตุผลที่time.clock()เลิกใช้แล้ว
Jim Aho

46

คำตอบสั้น ๆ คือส่วนใหญ่time.clock()จะดีกว่า อย่างไรก็ตามหากคุณกำหนดเวลาฮาร์ดแวร์บางตัว (เช่นอัลกอริทึมบางอย่างที่คุณใส่ใน GPU) time.clock()จะเป็นการกำจัดเวลานี้และtime.time()เป็นทางออกเดียวที่เหลืออยู่

หมายเหตุ: ไม่ว่าวิธีการใดที่ใช้เวลาจะขึ้นอยู่กับปัจจัยที่คุณไม่สามารถควบคุมได้ (เมื่อสวิตช์กระบวนการทำงานบ่อยแค่ไหน ... ) สิ่งนี้แย่กว่าtime.time()แต่มีอยู่ด้วยtime.clock()ดังนั้นคุณไม่ควรรันการทดสอบเวลาเดียวเท่านั้น แต่ให้เรียกใช้ชุดการทดสอบเสมอและดูค่าเฉลี่ย / ความแปรปรวนของเวลา


เมื่อร้องขอทรัพยากรเครือข่ายด้วยวิธี async (กระบวนการจะถูกบล็อกเพื่อรอ) เวลาเครือข่ายจะถูกกำจัด
dasons

25

อื่น ๆมีคำตอบ Re: เทียบกับtime.time()time.clock()

แต่ถ้าคุณกำลังระยะเวลาการดำเนินการของบล็อกของรหัสสำหรับการเปรียบเทียบ / profiling วัตถุประสงค์ที่คุณควรจะดูที่เป็นโมดูลtimeit


16
+1: timeit.default_timerถูกกำหนดให้time.time()หรือtime.clock()ขึ้นอยู่กับระบบปฏิบัติการ บน Python 3.3+ ขึ้นdefault_timerอยู่time.perf_counter()กับทุกแพลตฟอร์ม
jfs

19

สิ่งหนึ่งที่ต้องเก็บไว้ในใจ: การเปลี่ยนเวลาของระบบส่งผลกระทบแต่ไม่time.time()time.clock()

ฉันต้องการควบคุมการดำเนินการทดสอบอัตโนมัติ หากขั้นตอนหนึ่งของกรณีทดสอบใช้เวลามากกว่าระยะเวลาที่กำหนด TC นั้นจะถูกยกเลิกเพื่อไปต่อในขั้นตอนถัดไป

แต่บางครั้งขั้นตอนจำเป็นต้องเปลี่ยนเวลาของระบบ (เพื่อตรวจสอบโมดูลตัวกำหนดตารางเวลาของแอปพลิเคชันภายใต้การทดสอบ) ดังนั้นหลังจากตั้งเวลาระบบอีกสองสามชั่วโมงในอนาคตการหมดเวลา TC หมดอายุและกรณีทดสอบถูกยกเลิก ผมต้องเปลี่ยนจากtime.time()การtime.clock()ที่จะจัดการกับเรื่องนี้อย่างถูกต้อง


1
ฉันกำลังมองหาสิ่งนี้ ขอบคุณ :) มันจะช่วยฉันแม้ว่าผู้ใช้จะเปลี่ยนเวลาจากระบบปฏิบัติการ
Aashiq Hussain

ฉันจะเปรียบเทียบเวลานี้และเวลาที่จัดเก็บโดยผู้ใช้ในรูปแบบชั่วโมง: นาทีได้อย่างไร
Aashiq Hussain

19

clock() -> จำนวนจุดลอยตัว

กลับเวลา CPU clock()หรือเวลาจริงตั้งแต่จุดเริ่มต้นของกระบวนการหรือตั้งแต่สายแรกที่ สิ่งนี้มีความแม่นยำเท่ากับระบบบันทึก

time() -> จำนวนจุดลอยตัว

ส่งคืนเวลาปัจจุบันเป็นวินาทีตั้งแต่ยุค เศษส่วนของวินาทีอาจปรากฏขึ้นหากนาฬิกาของระบบแสดง

มักtime()จะมีความแม่นยำมากขึ้นเนื่องจากระบบปฏิบัติการไม่ได้จัดเก็บเวลาทำงานของกระบวนการด้วยความแม่นยำที่พวกเขาเก็บเวลาของระบบ (เช่นเวลาจริง)


17

ขึ้นอยู่กับสิ่งที่คุณสนใจ หากคุณหมายถึง WALL TIME (เช่นในเวลาบนนาฬิกาบนผนังของคุณ) time.clock () ไม่มีความแม่นยำเนื่องจากอาจจัดการเวลาของ CPU


1
แน่นอนว่าฉันเพิ่งใช้time.clock()กับเซิร์ฟเวอร์ Linux และตัวเลขที่ฉันได้รับไม่ได้แน่นอน
Roman Plášil

15

time()มีความแม่นยำดีกว่าclock()บน Linux clock()มีความแม่นยำน้อยกว่า 10 ms เท่านั้น ในขณะที่time()ให้ความแม่นยำนายอำเภอ การทดสอบของฉันอยู่บน CentOS 6.4, python 2.6

using time():

1 requests, response time: 14.1749382019 ms
2 requests, response time: 8.01301002502 ms
3 requests, response time: 8.01491737366 ms
4 requests, response time: 8.41021537781 ms
5 requests, response time: 8.38804244995 ms

using clock():

1 requests, response time: 10.0 ms
2 requests, response time: 0.0 ms 
3 requests, response time: 0.0 ms
4 requests, response time: 10.0 ms
5 requests, response time: 0.0 ms 
6 requests, response time: 0.0 ms
7 requests, response time: 0.0 ms 
8 requests, response time: 0.0 ms

ดังนั้นฉันจึงคิดว่าเวลา () กับไวน์ ??
Tcll

6

ความแตกต่างเป็นแพลตฟอร์มเฉพาะมาก

clock () นั้นแตกต่างกันมากบน Windows มากกว่าบน Linux ตัวอย่างเช่น

สำหรับตัวอย่างที่คุณอธิบายคุณอาจต้องการโมดูล "timeit" แทน


3
คุณอาจจะขยายตัวในสิ่งที่วิธีclockคือ"very different"?
n611x007

5

อย่างที่คนอื่น ๆ ได้สังเกต time.clock()จะเลิกในความโปรดปรานของ time.perf_counter()หรือtime.process_time()แต่งูหลาม 3.7 แนะนำ nanosecond ระยะเวลาที่มีความละเอียดtime.perf_counter_ns(), time.process_time_ns()และtime.time_ns()พร้อมกับ 3 ฟังก์ชั่นอื่น ๆ

ฟังก์ชันความละเอียด nansecond 6 รายการใหม่เหล่านี้มีรายละเอียดในPEP 564 :

time.clock_gettime_ns(clock_id)

time.clock_settime_ns(clock_id, time:int)

time.monotonic_ns()

time.perf_counter_ns()

time.process_time_ns()

time.time_ns()

ฟังก์ชันเหล่านี้คล้ายกับรุ่นที่ไม่มีส่วนต่อท้ายของ _ns แต่คืนค่าจำนวนนาโนวินาทีเป็น Python int

ตามที่คนอื่น ๆ ระบุไว้ใช้ timeitโมดูลฟังก์ชั่นเวลาและตัวอย่างโค้ดขนาดเล็ก


3

บน Unix time.clock () วัดปริมาณเวลา CPU ที่ถูกใช้โดยกระบวนการปัจจุบันดังนั้นจึงไม่ดีสำหรับการวัดเวลาที่ผ่านไปจากบางจุดในอดีต ใน Windows มันจะวัดวินาทีของนาฬิกาแขวนที่ผ่านไปนับตั้งแต่การเรียกครั้งแรกไปยังฟังก์ชั่น ในทั้งระบบ time.time () จะส่งคืนวินาทีที่ผ่านไปตั้งแต่ยุค

หากคุณกำลังเขียนโค้ดที่มีความหมายเฉพาะกับ Windows จะใช้งานได้ (แม้ว่าคุณจะใช้ทั้งสองอย่างแตกต่างกัน - ไม่จำเป็นต้องใช้การลบสำหรับ time.clock ()) หากสิ่งนี้กำลังทำงานบนระบบ Unix หรือคุณต้องการรหัสที่รับประกันว่าสามารถพกพาได้คุณจะต้องใช้ time.time ()


2

คำตอบสั้น ๆ : ใช้time.clock ()เพื่อกำหนดเวลาเป็น Python

บนระบบ * nix นาฬิกา () จะคืนค่าเวลาตัวประมวลผลเป็นหมายเลขทศนิยมซึ่งแสดงเป็นวินาที บน Windows จะส่งคืนวินาทีที่ผ่านไปนับตั้งแต่การเรียกครั้งแรกไปยังฟังก์ชันนี้เป็นหมายเลขจุดลอย

time () ส่งคืนวินาทีตั้งแต่ยุคใน UTC เป็นหมายเลขทศนิยม ไม่มีการรับประกันว่าคุณจะได้รับความแม่นยำที่ดีกว่าว่า 1 วินาที (แม้ว่าเวลา () จะส่งกลับตัวเลขทศนิยม) โปรดทราบว่าหากตั้งนาฬิการะบบกลับระหว่างการโทรสองครั้งไปยังฟังก์ชั่นนี้การเรียกใช้ฟังก์ชันที่สองจะส่งกลับค่าที่ต่ำกว่า


2

เพื่อความเข้าใจที่ดีที่สุดของฉัน time.clock () มีความแม่นยำมากที่สุดเท่าที่ระบบของคุณจะอนุญาต


2

ฉันใช้รหัสนี้เพื่อเปรียบเทียบ 2 วิธีระบบปฏิบัติการของฉันคือ windows 8, โปรเซสเซอร์คอร์ i5, RAM 4GB

import time

def t_time():
    start=time.time()
    time.sleep(0.1)
    return (time.time()-start)


def t_clock():
    start=time.clock()
    time.sleep(0.1)
    return (time.clock()-start)




counter_time=0
counter_clock=0

for i in range(1,100):
    counter_time += t_time()

    for i in range(1,100):
        counter_clock += t_clock()

print "time() =",counter_time/100
print "clock() =",counter_clock/100

เอาท์พุท:

เวลา () = 0.0993799996376

นาฬิกา () = 0.0993572257367


1

คำตอบที่ถูกต้อง: พวกมันมีความยาวเท่ากันทั้งเศษ

แต่ถ้าเร็วกว่าsubjectนี้timeล่ะ

กรณีทดสอบเล็กน้อย :

import timeit
import time

clock_list = []
time_list = []

test1 = """
def test(v=time.clock()):
    s = time.clock() - v
"""

test2 = """
def test(v=time.time()):
    s = time.time() - v
"""
def test_it(Range) :
    for i in range(Range) :
        clk = timeit.timeit(test1, number=10000)
        clock_list.append(clk)
        tml = timeit.timeit(test2, number=10000)
        time_list.append(tml)

test_it(100)

print "Clock Min: %f Max: %f Average: %f" %(min(clock_list), max(clock_list), sum(clock_list)/float(len(clock_list)))
print "Time  Min: %f Max: %f Average: %f" %(min(time_list), max(time_list), sum(time_list)/float(len(time_list)))

ฉันไม่ได้ทำงานในห้องปฏิบัติการของสวิส แต่ฉันได้ทำการทดสอบ ..

ตามคำถามtime.clock()นี้ดีกว่าtime.time()

แก้ไข: time.clock()เป็นตัวนับภายในดังนั้นจึงไม่สามารถใช้ภายนอกรับข้อ จำกัดmax 32BIT FLOATไม่สามารถนับต่อได้หากไม่เก็บค่าแรก / ค่าสุดท้าย ไม่สามารถรวมอีกหนึ่งตัวนับ ...


0

time.clock()ถูกลบใน Python 3.8 เพราะมันมีพฤติกรรมที่ขึ้นกับแพลตฟอร์ม :

  • บนUnixให้ส่งคืนเวลาตัวประมวลผลปัจจุบันเป็นหมายเลขทศนิยมที่แสดงในหน่วยวินาที
  • บนWindowsฟังก์ชั่นนี้จะส่งคืนวินาทีของนาฬิกาแขวนที่ผ่านไปนับตั้งแต่การโทรครั้งแรกไปที่ฟังก์ชั่นนี้เป็นหมายเลขจุดลอยตัว

    print(time.clock()); time.sleep(10); print(time.clock())
    # Linux  :  0.0382  0.0384   # see Processor Time
    # Windows: 26.1224 36.1566   # see Wall-Clock Time

ดังนั้นฟังก์ชั่นที่จะเลือกแทน?

  • เวลาตัวประมวลผล : นี่คือระยะเวลาที่กระบวนการเฉพาะนี้ใช้กับการประมวลผลบน CPU อย่างแข็งขัน สลีปรอการร้องขอจากเว็บหรือเวลาที่ดำเนินการเฉพาะกระบวนการอื่นเท่านั้นที่จะไม่ส่งผลต่อสิ่งนี้

    • ใช้ time.process_time()
  • เวลาของนาฬิกาแขวนผนัง : หมายถึงจำนวนเวลาที่ผ่านไป "บนนาฬิกาที่แขวนอยู่บนกำแพง" เช่นนอกเวลาจริง

    • ใช้ time.perf_counter()

      • time.time() สามารถวัดเวลานาฬิกาปลุกได้ แต่สามารถรีเซ็ตได้ดังนั้นคุณสามารถย้อนเวลากลับไปได้
      • time.monotonic() ไม่สามารถรีเซ็ตได้ (monotonic = เดินหน้าต่อไปเท่านั้น) แต่มีความแม่นยำต่ำกว่า time.perf_counter()

-1

เปรียบเทียบผลการทดสอบระหว่าง Ubuntu Linux และ Windows 7

บน Ubuntu

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5005500316619873

บน Windows 7

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5

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