繁体   English   中英

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

[英]How to run an IPython magic from a script (or timing a Python script)

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

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

运行代码数百万次。 %timeit IPyhton magic命令会自动执行此操作。 我建议我可以使用MATLAB代码http://www.mathworks.com/matlabcentral/fileexchange/18798

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

如何从Python脚本中调用%timeit magic(或者可能有更好的时序解决方案)?

这取决于你拥有哪个版本的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 magicIPython实现Python timeit标准模块进行比较,看看它们的作用大致相同。

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

如果在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开关是必需的,以便变量在范围内。 我没有想到如何在不运行IPython实例的情况下执行此操作,即只需从IPython导入timeit并将其用作函数。 但是,此解决方案适用于我的目的,即自动执行某些计时运行。

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

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

这就是IPython所做的。 这就是为什么循环的数量始终是10的幂。你可以在你自己的代码中做类似的事情,在循环中嵌入对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)

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

运行ipython magic函数的一种方法可能是使用embed ipython实例。
例如:(大多数代码都是从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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM