【问题标题】:Time python scripts using IPython magic使用 IPython 魔法计时 python 脚本
【发布时间】:2014-09-20 06:02:17
【问题描述】:

如何使用 iPython %time 或 %%timeit 魔术命令对 Python 脚本的执行进行计时?例如,我有 script.py,我想知道执行需要多长时间。细微差别:script.py 需要输入参数。以下似乎不起作用。

%%time script.py input_param1 input_param2

【问题讨论】:

  • 附带说明,为什么不重构 script.py 以便它可以用作模块(这样您可以导入它,然后 script.run(input_param1, input_param2) 执行相同的操作,就好像这两个值是 @ 987654325@ 在命令行上)?这可能对各种测试都有帮助,而不仅仅是性能测试……
  • @abarnert 你介意举一个简单的例子来说明将 script.py 重构为一个模块会是什么样子吗?
  • 可以通过将代码放在函数中来重构脚本以使其也可以作为模块工作(并且还包括声明if __name__ == '__main__': main()(在:之后使用换行符,作为推荐的样式;这里我我在评论中写,所以我不能插入换行符)如果代码将作为脚本运行),如Python documentation中所述。

标签: python profiling ipython ipython-magic


【解决方案1】:

解决方案

您可以使用:

%%timeit
%run script.py input_param1 input_param2

注意脚本会被执行多次(次数是自适应的)。只执行一次(并且时间不太准确)将第一行更改为

%%timeit -n1 -r1

说明

所有以%% 开头的魔法命令都适用于整个单元格。特别是%%timeit 将对单元格中的所有行计时。

IPython 允许在代码的任何点(即循环、if-then)中使用魔术命令(单个 %)。这里我们只是使用魔术命令%run 来运行脚本。

另请参阅:来自官方 IPython 文档的Magic functions

【讨论】:

    【解决方案2】:

    您也可以尝试cProfile,这是一个标准的内置 Python 分析器,推荐给大多数用户。

    除了每个函数的总运行时间和每个函数被调用的次数之外,它还给出了总运行时间。

    以下是运行脚本时如何使用它的示例。结果保存到名为“output_stats”的文件中:

    import cProfile
    import pstats
    
    cProfile.run(open('primes.py', 'rb'), 'output_stats')
    
    p = pstats.Stats('output_stats')
    
    p.sort_stats('cumulative').print_stats(10)
    Thu May 14 09:26:09 2015    output_stats
         369 function calls in 0.213 seconds
    
       Ordered by: cumulative time
       List reduced from 89 to 10 due to restriction <10>
       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
            1    0.000    0.000    0.213    0.213 primes.py:1(<module>)
            1    0.019    0.019    0.213    0.213 primes.py:22(prime)
            2    0.141    0.070    0.181    0.091 primes.py:1(primes)
            3    0.041    0.014    0.041    0.014 {range}
            4    0.000    0.000    0.013    0.003 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/iostream.py:207(write)
            1    0.000    0.000    0.010    0.010 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/iostream.py:151(flush)
            1    0.000    0.000    0.010    0.010 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/session.py:589(send)
            1    0.000    0.000    0.009    0.009 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/session.py:530(serialize)
            4    0.000    0.000    0.007    0.002 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/session.py:84(<lambda>)
            4    0.000    0.000    0.007    0.002 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/zmq/utils/jsonapi.py:31(dumps)
    

    ===

    名为 primes.py 的示例脚本文件:

    def primes(n): 
        if n == 2:
            return [2]
        elif n < 2:
            return []
        s=range(3, n + 1, 2)
        mroot = n ** 0.5
        half=(n + 1) / 2 - 1
        i = 0
        m = 3
        while m <= mroot:
            if s[i]:
                j = (m * m - 3) / 2
                s[j] = 0
                while j < half:
                    s[j] = 0
                    j += m
            i = i + 1
            m = 2 * i + 3
        return [2] + [x for x in s if x]
    
    def prime(a, b):
        print(primes(a))
        print(primes(b))
    
    if __name__ == "__main__":
        prime(10, 100)
    

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      相关资源
      最近更新 更多