การทดสอบความเร็ว Python - ความแตกต่างของเวลา - มิลลิวินาที


138

วิธีที่เหมาะสมในการเปรียบเทียบ 2 ครั้งใน Python เพื่อทดสอบความเร็วส่วนหนึ่งของโค้ดคืออะไร? ฉันลองอ่านเอกสาร API ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่กำหนดเวลา

จนถึงตอนนี้ฉันมีรหัสนี้:

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here

17
ทำไมคุณไม่พิมพ์ t2-t1 อะไรหยุดคุณจากการลบ?
ล็อต

22
เดาว่าฉันมีช่วงเวลา "มันไม่ง่ายอย่างนั้น"
BuddyJoe

คำตอบ:


194

datetime.timedelta เป็นเพียงความแตกต่างระหว่างสองวันที่ ... ดังนั้นมันจึงเหมือนกับช่วงเวลาหนึ่งเป็นวัน / วินาที / ไมโครวินาที

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a

>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543

โปรดทราบว่าc.microsecondsส่งคืนเฉพาะส่วนไมโครวินาทีของไทม์เดลตาเท่านั้น! c.total_seconds()สำหรับวัตถุประสงค์ของการกำหนดเวลาที่มักจะใช้

คุณสามารถทำคณิตศาสตร์ได้ทุกประเภทด้วย datetime.timedelta เช่น:

>>> c / 10
datetime.timedelta(0, 0, 431654)

การดูเวลา CPU แทนเวลาวอลล์คล็อกอาจมีประโยชน์มากกว่าแม้ว่า ... ระบบปฏิบัติการจะขึ้นอยู่กับว่า ... ภายใต้ระบบที่เหมือน Unix ให้ตรวจสอบคำสั่ง 'time'


ใครสนใจรับจำนวนนาทีทั้งหมดสามารถใช้int(c.total_seconds() / 60)ในกรณีนี้
sufinawaz

2
หน้าสำหรับโมดูล timeitบอกว่าโมดูล "หลีกเลี่ยงจำนวนของกับดักที่พบบ่อยสำหรับการวัดเวลาการดำเนินการ." แนวทางนี้ (โดยใช้ datetime.now) อยู่ภายใต้ข้อผิดพลาดเหล่านั้นหรือไม่
kuzzooroo

@kuzzooroo ใช่แล้ว! จะดีกว่าถ้าใช้ timeit แทนวิธีนี้! ตัวอย่างเช่นฉันมีการทดสอบในโครงการ python ขนาดใหญ่ซึ่งเมื่อวัดโดยใช้วิธีนี้จะทำให้ได้รันไทม์ 0.25 วินาที ในความเป็นจริงและตามเวลารันไทม์ของฟังก์ชั่นดังกล่าวคือ 30 วินาทีจริงๆ!
kazaamjt

62

เนื่องจาก Python 2.7 มีเมธอด timedelta.total_seconds () ดังนั้นเพื่อให้ได้มิลลิวินาทีที่ผ่านไป:

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077


21

คุณยังสามารถใช้:

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

หรือคุณอาจจะใช้โปรหลาม


2
เมื่อใช้มันพิมพ์start = time.clock() 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
Contango

17

ฉันรู้ว่ามันช้าไป แต่จริงๆแล้วฉันชอบใช้:

import time
start = time.time()

##### your timed code here ... #####

print "Process time: " + (time.time() - start)

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

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05

ในตัวอย่างแรกด้านบนคุณจะแสดงเวลา 0.05 สำหรับ time.clock () เทียบกับ 0.06377 สำหรับ time.time ()

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472

ในตัวอย่างที่สองเวลาของโปรเซสเซอร์จะแสดงเป็น "0" แม้ว่ากระบวนการจะเข้าสู่ช่วงวินาทีก็ตาม time.time()แสดงอย่างถูกต้องมากกว่า 1 วินาทีเล็กน้อย


NameError: ไม่ได้กำหนดชื่อ 'เวลา'
โจ

คุณต้องการimport timeคำชี้แจง
mgoldwasser



4

ฉันไม่ใช่โปรแกรมเมอร์ Python แต่ฉันรู้วิธีใช้ Googleและนี่คือสิ่งที่ฉันพบ: คุณใช้โอเปอเรเตอร์ "-" ในการกรอกรหัสของคุณ:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

นอกจากนี้ดูเหมือนว่าคุณสามารถใช้ฟังก์ชัน strftime () เพื่อจัดรูปแบบการคำนวณช่วงเวลาเพื่อแสดงเวลา แต่ทำให้คุณมีความสุข


ดูความคิดเห็นที่สองที่ระดับคำถาม
BuddyJoe

15
"แต่ฉันรู้วิธีใช้ Google" - เห็นได้ชัดว่าคุณไม่รู้วิธีใช้ Stack Overflow เพราะจุดประสงค์ทั้งหมดของเว็บไซต์นี้คือเพื่อให้ผู้คนถามและตอบคำถามเกี่ยวกับการเขียนโปรแกรมได้อย่างถูกต้องและตรงประเด็นไม่ใช่ เพื่อเล่าถึงวิธีการที่ "คุณสามารถใส่ Goggled แทนได้"
Hejazzman

ฉันมาถึงที่นี่โดย googling :)
Jamie Cook

2

time.time () / datetime เหมาะสำหรับการใช้งานอย่างรวดเร็ว แต่ไม่แม่นยำ 100% เสมอไป ด้วยเหตุนี้ฉันจึงชอบใช้ std lib profilers (โดยเฉพาะ hotshot) เพื่อค้นหาว่าคืออะไร



2

นี่คือฟังก์ชั่นที่กำหนดเองที่ / คู่ของเลียนแบบของ Matlab ของtic tocฟังก์ชั่น

ตัวอย่างการใช้งาน:

time_var = time_me(); # get a variable with the current timestamp

... run operation ...

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')

ฟังก์ชัน:

def time_me(*arg):
    if len(arg) != 0: 
        elapsedTime = time.time() - arg[0];
        #print(elapsedTime);
        hours = math.floor(elapsedTime / (60*60))
        elapsedTime = elapsedTime - hours * (60*60);
        minutes = math.floor(elapsedTime / 60)
        elapsedTime = elapsedTime - minutes * (60);
        seconds = math.floor(elapsedTime);
        elapsedTime = elapsedTime - seconds;
        ms = elapsedTime * 1000;
        if(hours != 0):
            print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
        elif(minutes != 0):
            print ("%d minutes %d seconds" % (minutes, seconds))
        else :
            print ("%d seconds %f ms" % (seconds, ms))
    else:
        #print ('does not exist. here you go.');
        return time.time()

Traceback (โทรล่าสุดล่าสุด): ไฟล์ "redis-get-response.py" บรรทัด 22 ใน <module> time_var = time_me (); # รับตัวแปรที่มีไฟล์ประทับเวลาปัจจุบัน "redis-get-response.py" บรรทัด 20 ใน time_me return time.time () NameError: ไม่ได้กำหนดชื่อ 'เวลา
โจ


0

ลูกศร: วันที่และเวลาที่ดีขึ้นสำหรับ Python

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.