Подтвердить что ты не робот

Как выполнить время выполнения пакета кода в 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"
4b9b3361

Ответ 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