[英]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
magic的IPython实现与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.