`
wx1568037608
  • 浏览: 34760 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

测试代码的执行时间魔法方法%time和%timeit

 
阅读更多

对于规模更大、运行时间更长的数据分析应用程序,你可能会希望测试一下各个部分或函数调用或语句的执行时间。你可能会希望了解某个复杂计算过程中到底是哪些函数占用的时间最多。幸运的是,在开发和测试代码的过程中,IPython能够让你轻松得到这些信息。使用内置的time模块及其time.clock和time.time函数手工测试代码执行时间是一件令人烦闷的事情,因为你必须编写许多一模一样的了无生趣的公式化代码:

  1.  
    import time
  2.  
    start = time.time()
  3.  
    for i in range(iterations):
  4.  
    # 这里放一些待执行的代码
  5.  
    elapsed_per = (time.time() - start) / iterations

由于这是一个非常常用的功能,所以IPython专门提供了两个魔术函数(%time和%timeit)以便自动完成该过程。%time一次执行一条语句,然后报告总体执行时间。假设我们有一大堆字符串,希望对几个“能够选出具有特殊前缀的字符串”的函数进行比较。下面是一个拥有60万字符串的数组,以及两个不同的“能够选出其中以foo开头的字符串”的方法:

  1.  
    # 一个非常大的字符串数组
  2.  
    strings = ['foo', 'foobar', 'baz', 'qux', 'python', 'Guido Van Rossum'] * 100000
  3.  
    method1 = [x for x in strings if x.startswith('foo')]
  4.  
    method2 = [x for x in strings if x[:3] == 'foo']

看上去它们的性能表现应该差不多,对吧?我们通过%time来确认一下:

  1.  
    In [561]: %time method1 = [x for x in strings if x.startswith('foo')]
  2.  
    CPU times: user 0.19 s, sys: 0.00 s, total: 0.19 s
  3.  
    Wall time: 0.19 s
  4.  
     
  5.  
    In [562]: %time method2 = [x for x in strings if x[:3] == 'foo']
  6.  
    CPU times: user 0.09 s, sys: 0.00 s, total: 0.09 s
  7.  
    Wall time: 0.09 s

墙上时间(Wall time)是我们最感兴趣的数字。所以,看上去第一个方法耗费了两倍以上的时间,但这并不是一个非常精确的结果。如果你对相同语句多次执行%time的话,就会发现其结果是会变的。为了得到更为精确的结果,需要使用魔术函数%timeit。对于任意语句,它会自动多次执行以产生一个非常精确的平均执行时间。

  1.  
    In [563]: %timeit [x for x in strings if x.startswith('foo')]
  2.  
    10 loops, best of 3: 159 ms per loop
  3.  
      
  4.  
    In [564]: %timeit [x for x in strings if x[:3] == 'foo']
  5.  
    10 loops, best of 3: 59.3 ms per loop

这个貌似平淡无奇的例子正好说明了一个事实:我们非常有必要了解Python标准库、NumPy、pandas以及本书中所用到的其他库的性能特点。在大型数据分析应用程序中,这些不起眼的毫秒数是会不断累积的!

对于那些执行时间非常短(甚至是那些微秒(1e-6秒)或纳秒(1e-9秒)级的)的分析语句和函数而言,%timeit是非常有用的。虽然这些时间值小到几乎可以忽略不计,但同样执行100万次一个20微秒的函数,所用的时间要比一个5微秒的多15秒。在上面那个例子中,我们可以直接对那两个字符串运算进行比较以了解其性能特点:

  1.  
    In [565]: x = 'foobar'
  2.  
     
  3.  
    In [566]: y = 'foo'
  4.  
     
  5.  
    In [567]: %timeit x.startswith(y)
  6.  
    1000000 loops, best of 3: 267 ns per loop
  7.  
     
  8.  
    In [568]: %timeit x[:3] == y
  9.  
    10000000 loops, best of 3: 147 ns per loop
分享到:
评论

相关推荐

    %time、%timeit、%%time、%%timeit的区别(ipython中查看代码执行时间的魔法命令)

    %time: 在行模式下,代码运行一次所花费的时间。 %%time:在单元模式下,代码运行一次所花费的时间。 %timeit: 在行模式下,执行代码块若干次,取最佳结果。 %%timeit: 在单元模式下,执行代码块若干次,取最佳...

    python 代码运行时间获取方式详解

    使用%time命令后直接跟上需要测试的代码片段,IPython解释器执行完代码后会自动输出该段代码的运行时间。但是,需要注意的是,%time测量出的时间可能会因计算机当前的运行状态不同而有所波动。以下是使用%time命令的...

    IPython的魔法命令以热图用剖析和查看Python代码

    除了 `pyheatmagic`,IPython 还提供了其他与代码分析相关的魔法命令,如 `%timeit` 用于测量代码片段的执行时间,`%memit` 用于测量代码的内存消耗。通过结合使用这些工具,我们可以全面地评估和优化我们的 Python ...

    Python如何计算语句执行时间

    其中,`%time` 和 `%timeit` 是用于测量代码执行时间的两个关键命令。 - **%time**:此命令用于计算单个语句的执行时间。例如: ```python %time sum(range(1000)) ``` 输出将显示执行时间,如 `Wall time: 0 ...

    ruby测试代码6

    标题“ruby测试代码6”和描述“ruby测试代码6”暗示了这是一个关于使用Ruby语言进行的测试代码项目,可能涉及到不同的模块或者数据结构。标签“ruby测试代码6”进一步确认了这一主题。从压缩包子文件的文件名称列表...

    python Jupyter运行时间实例过程解析

    Jupyter Notebook提供了两种魔法命令,`%%time` 和 `%time`,用于度量代码块的执行时间。 - `%%time` 适用于整个代码单元格。它会执行整个单元格中的代码,并输出执行的总时间(包括用户时间和系统时间)。例如: ...

    python获取代码运行时间的实例代码

    综上所述,通过正确使用Python的`time`模块或IPython的魔法命令,我们可以有效地测量代码的运行时间,这对于优化代码性能、排查性能瓶颈以及理解程序执行流程都至关重要。在实践中,记得根据具体需求选择合适的方法...

    01_使用Jupyter-Notebook1

    - `%time`: 计算单次执行的总时间。 - `%html`: 在单元格中执行HTML代码。 - `%js`: 运行JavaScript代码。 - `%writefile`: 将单元格内容写入文件。 例如,你可以使用`%timeit`命令来比较两种不同的排序算法的效率...

    查看jupyter notebook每个单元格运行时间实例

    这样,你就可以直观地看到代码执行所需的时间,无论是单行代码(使用行魔法 `%time`)还是整个单元格(使用单元魔法 `%%time`)。 行魔法 `%time` 用于测量单行代码的运行时间。例如: ```python %time print(...

    深度解析Java中的5个“黑魔法”完整源代码

    本篇文章将深入探讨五个这样的“黑魔法”知识点,并提供相关的源代码示例,帮助你更好地理解和掌握它们。下面我们将逐个分析这些Java中的奇妙之处。 1. 反射(Reflection) 反射是Java中的一种强大工具,允许程序...

    神奇的javascript"魔法代码"

    它定义了访问和修改网页内容的方法和属性。在本例中,通过`document.images`获取页面上所有的图片元素,并对其进行操作。 - **CSS (Cascading Style Sheets)**:层叠样式表,用于描述HTML文档的外观和格式。通过`DI...

    魔法兔子模块-MagicCony-源代码

    【魔法兔子模块-MagicCony-源代码】是一款基于C#编程语言开发的应用程序,它包含了一套完整的源代码,供开发者研究、学习或者进行二次开发。魔法兔子模块以其直观的用户界面和丰富的功能,为用户提供了一个高效的...

    人物施放魔法代码

    总之,"人物施放魔法代码"项目涵盖了游戏开发中的多个关键知识点,包括用户输入处理、游戏逻辑、图形渲染和资源管理等。通过理解和实现这样的项目,开发者可以深入学习游戏编程的基础原理和技巧。

    Excel宏魔法书与源代码

    《Excel宏魔法书与源代码》是一份针对Excel宏编程的综合学习资源,它结合了理论知识、实际操作和源代码实例,旨在帮助用户深入理解并掌握Excel宏的使用技巧。Excel宏是一种强大的功能,允许用户自定义Excel工作簿的...

    ______vc魔法寿司测试版

    综上所述,"VC魔法寿司测试版"是一个由个人开发者编写的基于Visual C++的游戏项目,受到手机游戏启发,目前正处于不断更新和完善的阶段。开发者使用了"taskmgr"标签,可能与游戏的性能监控或后台进程管理有关。主要...

    Python-在JupyterNotebook单元格中可视化Python代码逐行执行

    对于学习和教学,理解代码的执行过程至关重要,尤其是当涉及到复杂的逻辑或者调试时。本文将详细介绍如何在Jupyter Notebook中实现Python代码的逐行可视化执行。 "Python-在JupyterNotebook单元格中可视化Python...

    网页魔法菜单

    此时,浏览器加载网页时会执行这段代码,显示魔法菜单。 5. **测试与优化**:发布后,需要在不同的设备和浏览器上测试菜单的显示和功能,确保其在各种环境下都能正常工作。如有需要,可以返回菜单编辑器进行调整。 ...

    swift-利用AOP的思想通过方法交换(MethodSwizzle黑魔法修改ios系统类库方法)的做法

    它是通过改变类的方法实现指针,使得原本调用的方法执行不同的代码。在iOS开发中,我们通常在应用程序的启动阶段进行方法交换,以避免影响正常的程序流程。 首先,我们需要了解Method Swizzling的基本步骤: 1. ...

Global site tag (gtag.js) - Google Analytics