當我運行我的Python腳本時,有一些函數需要幾分鐘才能完成,所以我想在shell上顯示某種計時器,以便通知用戶時間過去。python:在shell上顯示已用時間
有沒有這樣的東西已經可以在Python中使用了?
當我運行我的Python腳本時,有一些函數需要幾分鐘才能完成,所以我想在shell上顯示某種計時器,以便通知用戶時間過去。python:在shell上顯示已用時間
有沒有這樣的東西已經可以在Python中使用了?
最簡單的方法是計算花費幾分鐘完成的函數中的已用時間,然後簡單地將該時間打印到shell。然而,根據你的功能,這可能不是最好的解決方案。
做到這一點的第二種方法是使用多線程。因此,函數需要一段時間才能在線程中運行,而您的程序則位於一個循環中,並且每隔一段時間就打印出一段時間,並查找要完成的線程。
喜歡的東西:
import threading
import time
arg1=0
arg2=1
etc=2
# your function that takes a while.
# Note: If your function returns something or if you want to pass variables in/out,
# you have to use Queues
def yourFunction(arg1,arg2,etc):
time.sleep(10) #your code would replace this
# Setup the thread
processthread=threading.Thread(target=yourFunction,args=(arg1,arg1,etc)) #set the target function and any arguments to pass
processthread.daemon=True
processthread.start() # start the thread
#loop to check thread and display elapsed time
while processthread.isAlive():
print time.clock()
time.sleep(1) # you probably want to only print every so often (i.e. every second)
print 'Done'
然後你可以通過覆蓋時間殼,甚至更好,使用GUI顯示進度條發燒友!
你說的是測量一個函數完成的時間,然後打印HH:MM:SS.MS?
你可以這樣做:
import datetime, time
time_begin = datetime.datetime.fromtimestamp(time.time())
# call your function here
time_end = datetime.datetime.fromtimestamp(time.time())
print("Time elapsed: ", str(time_end - time_begin))
哦,不,不是。看到我對我原來的帖子的評論。不管怎樣,謝謝你。 – 2012-07-17 10:27:13
可以使用datetime
例如,
import datetime
import time
class Profiler(object):
def __init__(self):
self.start = 0
self.duration = 0
def start(self):
self.start = datetime.datetime.now()
def end(self):
self.duration = datetime.datetime.now() - self.start
class SomeClass(Profiler):
def __init__(self):
Profiler.__init__(self)
def do_someting(self):
self.start()
time.sleep(10)
self.end()
if __name__ == "__main__":
foo = SomeClass()
foo.do_something()
print 'Time :: ', foo.duration
如果你是一個Linux或BSD系統,嘗試pv
命令(http://www.ivarch.com/programs/pv.shtml) 。
$ python -c 'import time;time.sleep(5)' | pv
0B 0:00:05 [ 0B/s ] [<=> ]
它會給你一個計時器,並取決於你如何編碼你的應用程序的輸出,以及其他一些統計數據。
一個簡單的方法就是在您的sys.ps1
提示時鐘(的東西,通常定義>>>
提示)
從文檔sys.ps1
:如果一個非字符串對象分配
對任何一個變量,每次解釋者準備閱讀一個新的交互式命令時,它的
str()
被重新評估;這可以用來實現動態提示。
在~/.local/usercustomize.py
(或者更準確地說,在任何文件夾python -c 'import site; print site.USER_BASE'
顯示器),您可以添加:
import sys
import datetime
class ClockPS1(object):
def __repr__(self):
now = datetime.datetime.now()
return str(now.strftime("%H:%M:%S >>> "))
sys.ps1 = ClockPS1()
然後你提示會是這樣的:
16:26:24 >>> import time
16:26:27 >>> time.sleep(10)
16:26:40 >>>
它並不完美,因爲最後一次會出現提示符,而不是執行該行時,但可能有幫助。您可以輕鬆地在__repr__
調用之間以秒爲單位顯示該時間,並在提示中顯示該時間。
我'愛'這個答案 - 這正是我一直在尋找的東西。只有一個問題 - 我現在有辦法縮進輸出,以便更符合其他所有內容? – ArtOfWarfare 2013-10-31 17:43:23
@ArtOfWarfare你的意思是說,如果你運行'print'blah'',你想讓'blah'縮進9個空格(與時間戳對齊)?你可以攔截寫入'sys.stdout'和'sys.stderr'的所有內容,但是很難很好地處理(例如,如何處理長行?) – dbr 2013-11-01 10:11:43
是的,這就是我的意思。我決定改變時間的風格,以便打印成深青色文字 - 它有助於區分提示和輸出。 – ArtOfWarfare 2013-11-02 05:35:10
這將需要多線程 – gerrit 2012-07-16 14:36:29
該函數是否也用Python編寫的,以便您可以在其中添加幾行? – DSM 2012-07-16 14:41:11
nix命令'time'將顯示執行命令所需的時間,但僅在腳本完成後纔會顯示。 – dm03514 2012-07-16 14:54:47