如何测量Python代码的执行时间



需要此代码的帮助

import timeit
mysetup=""
mycode='''
def gener():
 ...my code here...
 return x
 '''
# timeit statement
print (timeit.timeit(setup = mysetup,
                    stmt = mycode,
                    number = 1000000))
print("done")

结果我得到了0.0008606994517737132当我阅读本单元时,"秒"那么我的效果在0.8毫秒内执行了100万次?我认为这不是真实的,太快了。

我也尝试了基本选项

start = time.time()
my code here
end = time.time()
print(end - start)

并获得0.23901081085205078一次执行,似乎有点慢...

那么我做错了什么?谢谢

您在mycode中为timeit方法定义了此方法的方式,将发生的只是定义函数gener,而不是运行。您需要在代码块中运行该功能才能报告执行时间所花费的时间。

至于时间长度是合理的(太快/太慢),这在很大程度上取决于您的代码在做什么。但是我怀疑您已经在方法2中执行了该函数,并且仅在方法1中定义了函数,因此差异。

编辑:示例代码

说明差异,在下面的示例中,块code1只是定义了一个函数,它不会执行它。块code2定义并执行功能。

import timeit
code1 = '''
def gener():
    time.sleep(0.01)
'''
code2 = '''
def gener():
    time.sleep(0.01)
gener()
'''

我们应该期望运行time.sleep(0.01) 100次大约1秒钟。code1运行timeit返回〜10^-5秒,因为该功能gener实际上并未称为:

timeit.timeit(stmt=code1, number=100)

code2运行timeit返回〜1秒的预期结果:

timeit.timeit(stmt=code2, number=100)

此外, setup参数的点是 do setup (代码的部分不应定时)。如果您希望timeit捕获gener执行时间时间,则应使用以下方式:

import timeit
setup = '''
def gener():
    time.sleep(0.01)
'''
stmt = "gener()"
timeit.timeit(setup=setup, stmt=stmt, number=100)

这将返回到运行的时间 gener 100次,不包括定义它所花费的时间。

这是测量代码段时间的一般方法。

import time
class timer(object):
    """
        A simple timer used to time blocks of code. Usage as follows:
        with timer("optional_name"):
            some code ...
            some more code
    """
    def __init__(self, name=None):
        self.name = name
    def __enter__(self):
        self.start = time.time()
        return self
    def __exit__(self, *args):
        self.end = time.time()
        self.interval = self.end - self.start
        if self.name:
            print("{} -  Elapsed time: {:.4f}s".format(self.name, self.interval))
        else:
            print("Elapsed time: {:.4f}s".format(self.interval))

GIST可在此处提供:https://gist.github.com/jakobovski/191b9e95ac964b61e8abc7436111d1f9

如果您想安排时间函数时间,则可以像这样:

# defining some function you want to time
def test(n):
    s = 0
    for i in range(n):
        s += i
    return s
# defining a function which runs the function to be timed with desired input arguments
timed_func = lambda : test(1000)
# the above is done so that we have a function which takes no input arguments
N = 10000 # number of repeats
time_per_run = timeit.timeit(stmt=timed_func, number=N)/N

对于您的情况,您可以这样做:

# defining some function you want to time
def gener():
    ...my code here...
    return x
N = 1000000 # number of repeats
time_per_run = timeit.timeit(stmt=gener, number=N)/N

库的任何导入都可以在全球范围内进行全球完成,然后拨打时间IT函数和TimeIT将使用全球导入的库

,例如

import numpy as np
# defining some function you want to time
def gener():
    ...my code here...
    x = np.sqrt(y)
    return x

N = 1000000 # number of repeats
time_per_run = timeit.timeit(stmt=gener, number=N)/N

工作代码

# importing the required module
import timeit
# code snippet to be executed only once
mysetup = '''
from collections import OrderedDict
def gener():
 some lines of code here
 return x'''
# code snippet whose execution time is to be measured
mycode="gener()"

# timeit statement
nb=10
print("The code run {} time in: ".format(nb ))
print("{} secondes".format(timeit.timeit(setup = mysetup,
                stmt = mycode,
                number = nb)))
print("done")

执行时间几乎是相同的,而

则是
start = time.time()
my code here
end = time.time()
print(end - start)

0.23 sec的时间ITIT和基本的测量代码高于0.24,它们都波动...所以谢谢,问题解决