Python 返回值的时间

Python 返回值的时间,python,profile,timeit,cprofile,Python,Profile,Timeit,Cprofile,我想廉价地测量函数的执行时间,比如: def my_timeit(func, *args, **kwargs): t0 = time.time() result = func(*args, **kwargs) delta = time.time() - t0 return delta, result def foo(): time.sleep(1.23) return 'potato' delta, result = my_timeit(foo

我想廉价地测量函数的执行时间,比如:

def my_timeit(func, *args, **kwargs):
    t0 = time.time()
    result = func(*args, **kwargs)
    delta = time.time() - t0
    return delta, result

def foo():
    time.sleep(1.23)
    return 'potato'

delta, result = my_timeit(foo)
但是我想使用
timeit
profile
或其他内置工具来处理由于平台差异而产生的常见陷阱,并且可能最好获得实际执行时间,而不是墙时间

我尝试使用
timeit.Timer(foo.timeit(number=1)
,但界面似乎掩盖了返回值

怎么样

>>time python yourprogram.py < input.txt
>time python yourprogram.py
这是我运行的python脚本的输出

[20:13:29] praveen:jan$ time python mtrick.py < input_mtrick.txt 
3 3 9
1 2 3 4
real    0m0.067s
user    0m0.016s
sys 0m0.012s
praveen:jan$time python mtrick.py
这是我当前的尝试。但我欢迎任何建议,因为这感觉太粗糙,可能需要改进

import time
from timeit import Timer

def my_timeit(func, *args, **kwargs):
    output_container = []
    def wrapper():
        output_container.append(func(*args, **kwargs))
    timer = Timer(wrapper)
    delta = timer.timeit(1)
    return delta, output_container.pop()

def foo():
    time.sleep(1.111)
    return 'potato'

delta, result = my_timeit(foo)

编辑:适用于以下装饰师的工作:

def timeit_decorator(the_func):

    @functools.wraps(the_func)
    def my_timeit(*args, **kwargs):
        output_container = []
        def wrapper():
            output_container.append(the_func(*args, **kwargs))
        timer = Timer(wrapper)
        delta = timer.timeit(1)
        my_timeit.last_execution_time = delta
        return output_container.pop()

    return my_timeit

你的问题是什么?为什么你只想运行一次计时器?这将消除
timeit
模块的一个优点;反复运行代码以消除随机操作系统和硬件事件的影响。因此“便宜”。这只是为了测量我的项目euler实现的执行时间,我的目标是将它们保持在10秒左右。我不想等待它运行不止一次。@wim天真的问题:使用
number=1
timeit
不会有这个技巧吗?timeit.Timer用于运行代码无数次,以精确测量小时间。在这种情况下,您并不真正关心返回值。Intead您想要的是@timeit decorno,我想在python内部完成这项工作。你能不能再举一个叫你的装饰师的例子?@Joel只是像普通的装饰师一样使用它。每次调用后,将在函数对象上设置
last\u execution\u time
属性。