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