首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何度量python代码的执行时间

如何度量python代码的执行时间
EN

Stack Overflow用户
提问于 2017-12-14 09:54:29
回答 4查看 2.3K关注 0票数 0

这段代码需要帮助

代码语言:javascript
运行
复制
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,因为我读到这个单位是在“秒”,所以我的功能执行100万次在0.8毫秒?我觉得这不是真的,太快了。

我也尝试了基本的选择

代码语言:javascript
运行
复制
start = time.time()
my code here
end = time.time()
print(end - start)

一次执行了0.23901081085205078次,看起来有点慢…

我做错什么了?谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-12-14 10:02:26

mycode中为timeit方法定义这个函数的方式,只会定义gener函数,而不是运行函数。您需要在代码块中运行该函数,以便报告执行所需的时间。

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

编辑:示例代码

为了说明不同之处,在下面的示例中,code1只定义了一个函数,它不执行它。块code2定义并执行函数。

代码语言:javascript
运行
复制
import timeit

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

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

我们应该期望运行time.sleep(0.01) 100次,大约需要1秒。为timeit运行code1返回~10^-5秒,因为函数gener实际上没有被调用:

代码语言:javascript
运行
复制
timeit.timeit(stmt=code1, number=100)

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

代码语言:javascript
运行
复制
timeit.timeit(stmt=code2, number=100)

此外,setup参数的要点是进行安装(代码中不打算计时的部分)。如果希望timeit捕获gener的执行时间,则应使用以下命令:

代码语言:javascript
运行
复制
import timeit

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

stmt = "gener()"

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

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

票数 2
EN

Stack Overflow用户

发布于 2019-04-26 12:14:47

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

代码语言:javascript
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2017-12-14 10:11:59

如果您想计时一个函数时间,可以这样使用它:

代码语言:javascript
运行
复制
# 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

就你的情况而言,你可以:

代码语言:javascript
运行
复制
# 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将使用全局导入的库。

例如:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47810404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档