如何从脚本运行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秒,但是不会更多 – 除非一次调用该函数需要很长时间。