繁体   English   中英

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

[英]how to measure execution time of python code

需要此代码的帮助

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.2390108108520505078一次执行似乎有点慢...

那我在做什么错呢? 谢谢

您在mycodetimeit方法定义的方式,将要发生的是将定义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秒。 运行timeitcode1的回报〜10 ^ -5秒,因为函数gener实际上没有被称为:

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

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

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

除此之外, setup参数的要点是进行setup (代码中不应该计时的部分)。 如果你想timeit捕获的执行时间gener ,你应该这样做:

import timeit

setup = '''
def gener():
    time.sleep(0.01)
'''

stmt = "gener()"

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

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

如果您想对函数time进行计时,可以这样使用:

# 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

可以在调用timeit函数之前全局进行任何库导入,并且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秒,基本测量代码为0.24以上,两者都会波动...因此,谢谢,问题已解决

这是一种测量代码段时间的通用方法。

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))

要点可以在这里找到: https : //gist.github.com/Jakobovski/191b9e95ac964b61e8abc7436111d1f9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM