如何从脚本运行IPython魔术(或计时Python脚本)

IPython%timeit magic命令在测量运行一些Python代码所需的时间方面做得很好。 现在,我想在Python脚本中使用类似的东西。 我知道timeit模块,但是,它有几个缺点,例如,如何自适应select运行次数? 即默认的代码

import timeit t=timeit.Timer("code(f)", "from __main__ import code,f") t.timeit() 

运行代码百万次。 %timeit IPyhton magic命令会自动执行。 我build议我可以使用类似MATLAB的代码http://www.mathworks.com/matlabcentral/fileexchange/18798

它自动完成所有的工作(并且还告诉函数的开销是否大)。

如何从Python脚本中调用%timeit魔法(或者有更好的时间解决scheme)?

这取决于你有哪个版本的IPython。 如果你有1.x:

 from IPython import get_ipython ipython = get_ipython() 

如果你有一个旧版本:

 import IPython.core.ipapi ipython = IPython.core.ipapi.get() 

要么

 import IPython.ipapi ipython = IPython.ipapi.get() 

一旦完成 ,运行一个像这样的魔术命令:

 ipython.magic("timeit abs(-42)") 

请注意,脚本必须通过ipython运行。

当使用python -m timeit调用IPython和timeit模块时,执行相同的循环,数值越来越大,直到时序结果超过一定的阈值,以保证时间测量大多不受操作系统干扰。

您可以将%timeit magic的IPython实现与Python timeit标准模块进行比较,以查看它们大致相同的情况。

所以,回答你的问题,你应该复制相同的循环,直到find数字参数的正确值。

如果在IPython中以交互方式运行Python脚本,以下工作。 例如, test.py

 def f(): # Algorithm 1 pass def g(): # Algorithm 2 pass # which one is faster? mgc = get_ipython().magic mgc(u'%timeit f()') mgc(u'%timeit g()') 

然后在IPython中以交互方式运行它

 %run -i test.py 

吐出时间。 -i开关是必要的,以便variables在范围内。 我还没有想出如何在不运行IPython实例的情况下执行此操作,即通过简单地从IPython中导入timeit并将其用作函数。 然而,这个解决scheme适用于我的目的,这是自动化一些计时运行。

运行ipython magic函数的一种方法可能是使用embeddedipython实例。
例如:(大部分代码都是从ipython网站上借用的)

 from IPython.terminal.embed import InteractiveShellEmbed ipshell = InteractiveShellEmbed() ipshell.dummy_mode = True print('\nTrying to call IPython which is now "dummy":') ipshell.magic("%timeit abs(-42)"); ipshell() print('Nothing happened...') 

这可以通过使用Python解释器
PS:使用dummy_mode将阻止调用交互式shell。

根据timeit.py模块的文档 ,当timeit在命令行模式下运行时,

如果没有给出-n,则通过尝试连续的10次幂来计算适当数量的循环,直到总时间至less为0.2秒。

这是IPython所做的。 这就是为什么循环次数总是10次方的原因。通过在循环中embedded对t.timeit()的调用,可以在自己的代码中做类似的事情,确保不会太久:

 import timeit t = timeit.Timer("code(f)", "from __main__ import code, f") max_time = 0.2 N = 0 curr_time = t.timeit(1) while curr_time < max_time: N += 1 curr_time = t.timeit(10**N) mean_time = curr_time / float(10**N) 

这将确保分析时间至less为0.2秒,但是不会更多 – 除非一次调用该函数需要很长时间。