Как выполнить время выполнения пакета кода в Python?
Я нашел этот вопрос и отвечу здесь на StackOverflow.
Python - time.clock() vs. time.time() - точность?
Вот какой код я пытаюсь запустить:
import sys
import time
import timeit
if (len(sys.argv) > 1):
folder_path = sys.argv[1]
if not os.path.isdir(folder_path):
print "The folder you provided doesn't exist"
else:
print_console_headers()
rename_files_to_title_case(folder_path)
#start the timer.
#do some freaky magic here.
#end the timer.
else:
print "You must provide a path to a folder."
def print_console_headers():
print "Renaming files..."
print "--------------------"
return
def rename_files_to_title_case():
"""this is just for testing purposes"""
L = []
for i in range(100):
L.append(i)
if __name__ == '__main__':
from timeit import Timer
t = Timer("test()", "from __main__ import test")
print t.timeit()
Как бы я дал timeit функцию с параметром, который был сохранен в другом месте?
Это то, что я написал в Ruby, который дал мне результаты в чистом коде, возможно, это помогает в предложениях.
start_time = Time.now
folder_path = ARGV[0]
i = 0
Dir.glob(folder_path + "/*").sort.each do |f|
filename = File.basename(f, File.extname(f))
File.rename(f, folder_path + "/" + filename.gsub(/\b\w/){$&.upcase} + File.extname(f))
i += 1
end
puts "Renaming complete."
puts "The script renamed #{i} file(s) correctly."
puts "----------"
puts "Running time is #{Time.now - start_time} seconds"
Ответы
Ответ 1
Вот как я обычно пишу код измерения времени в Python:
start_time = time.time()
# ... do stuff
end_time = time.time()
print("Elapsed time was %g seconds" % (end_time - start_time))
Как упоминалось в сообщении, которое вы связали, time.clock()
не подходит для измерения прошедшего времени, так как он сообщает количество процессорного времени, используемого только вашим процессом (по крайней мере, в Unix-системах). Использование time.time()
является кросс-платформенным и надежным.
Ответ 2
Я бы использовал декоратор времени и поместил код, который вы хотите использовать, в функцию.
import time
def timeit(f):
def timed(*args, **kw):
ts = time.time()
result = f(*args, **kw)
te = time.time()
print 'func:%r args:[%r, %r] took: %2.4f sec' % \
(f.__name__, args, kw, te-ts)
return result
return timed
Использование декоратора легко использовать аннотации.
@timeit
def compute_magic(n):
#function definition
#....
Или переименовать функцию, которую вы хотите использовать.
compute_magic = timeit(compute_magic)
В моем сообщении в блоге есть дополнительная информация. http://blog.mattalcock.com/2013/2/24/timing-python-code/
Ответ 3
Увлекательным способом выполнения функций времени является использование декораторов и функций обертки. Одна из функций, которые я использую для этого:
import time
def print_timing(func):
def wrapper(*arg):
t1 = time.time()
res = func(*arg)
t2 = time.time()
string = '| %s took %0.3f ms |' % (func.func_name, (t2-t1)*1000.0)
print
print '-'*len(string)
print string
print '-'*len(string)
print
return res
return wrapper
Любая функция, украшенная @print_timing, будет печатать печать времени, которое потребовалось для stdout
@print_timing
def some_function(text):
print text
Это очень удобно для конкретных функций времени.
Ответ 4
Если вам нужно измерить время определенных строк кода внутри функции, когда декоратор не может помочь, есть решение
import time
from time import sleep
class TT(object):
def __init__(self):
self.start = time.time()
def __str__(self):
return str(time.time() - self.start)
timeit = TT()
sleep(1)
print timeit
sleep(2)
print timeit
будет печатать:
1.0
3.00