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

如何从脚本(或Python脚本计时)运行IPython magic,python,ipython,Python,Ipython,IPython%timeit魔术命令在测量运行某些Python代码所需的时间方面做得很好。现在,我想在Python脚本中使用类似的东西。我知道timeit模块,但是它有几个缺点,例如,如何自适应地选择运行次数?i、 例如,默认代码 import timeit t=timeit.Timer("code(f)", "from __main__ import code,f") t.timeit() 运行代码一百万次。%timeit IPyhton魔术命令会自动执行此操作。我建议我可以使用类似MAT

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

import timeit
t=timeit.Timer("code(f)", "from __main__ import code,f")
t.timeit() 
运行代码一百万次。%timeit IPyhton魔术命令会自动执行此操作。我建议我可以使用类似MATLAB的代码

这会自动完成所有的工作(同时也会告知函数的开销是否很大)


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

当使用
Python-m timeit
调用时,IPython和
timeit
模块都可以调用,以递增的数字值执行相同的循环,直到计时结果超过某个阈值,该阈值保证时间测量基本上不受操作系统干扰

您可以将其与进行比较,以了解它们所做的基本相同


因此,回答您的问题时,您可能应该复制相同的循环,直到找到number参数的正确值。

这取决于您使用的IPython版本。如果您有1.x:

from IPython import get_ipython
ipython = get_ipython()
如果您有旧版本:

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

完成后,运行如下神奇命令:

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

请注意,脚本必须通过
ipython

运行。如果在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
,并将其用作函数。不过,此解决方案适用于我的目的,即自动化一些计时运行。

运行ipython magic函数的一种方法可能是使用嵌入式ipython实例。
例如:(大多数代码都是从中借用的)

这可以通过使用python解释器来实现
PS:使用dummy_模式将阻止调用交互式shell

根据
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)
import timeit
t=timeit.Timer(“代码(f)”,“从主导入代码,f”)
最大时间=0.2
N=0
当前时间=t.timeit(1)
当前时间<最大时间:
N+=1
当前时间=t.timeit(10**N)
平均时间=当前时间/浮动(10**N)

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

如果将其设置为IPython脚本(*.ipy),则所有IPython语法都将可用,并且您可以像平常一样执行
%timeit foo
。谢谢,这是个好建议。但是我在一个组织模式文件中使用了它,我认为它只知道python:)更多关于@minrk的建议:好的,我可以复制timeit模块的“main”部分。不知道为什么它没有包含在库中。这适用于IPython 1.x:
来自IPython import get_-IPython
IPython=get_-IPython()
@suzanshakya get_-IPython()在以前工作过的实例中似乎没有返回任何值。可以举出一个例子吗?@gbage您需要使用
ipython
而不是
python
运行脚本。你可能不知道如何做到这一点以达到同样的目的?具体来说,我希望能够调用
prun
并分析导入的函数。改用
运行\u line\u magic()
。还可以从IPython import get IPython中查看
run\u cell\u magic()
;ipython=get_ipython()
在v4.2.0上返回“AttributeError:'NoneType'”,但这似乎工作正常。
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...')
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)