本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍jupyter Notebook中的两个魔法命令%run和%time。
%run魔法命令
应用场景:
如果我们想在jupyter中调用我们自己编写的代码的话,当然这里自己的代码指的是单独的.py文件(也叫做脚本文件)。
首先我在桌面上创建一个hello.py文件,里面的Python代码为如下所示:
我将脚本文件和我想要调用脚本文件的jupyter的.ipynb文件放在同一路径下:
我们就可以使用 %run 的魔法命令将脚本文件进行加载调用:
结果会打印出"Hello Machine Learning!"。但是此时需要注意的是我们不仅仅是调用了一次hello.py脚本,同时也将整个脚本加载进了整个jupyter notebook中,你可以在之后的任意cell中调用hello.py脚本的任何方法。如下面在hello.py脚本中在加入如下方法,在脚本中不调用:
然后继续在jupyter使用 %run 的魔法命令来调用他:
和前面没有加 byb 函数的效果是一样的,但是我们可以在下一个cell中试试调用 byb() 这个函数:
以上足以说明 %run 命令不仅仅调用了脚本还将脚本加载进了jupyter中,我们可以在里面任意调用脚本中的方法函数。
前面介绍完了使用 %run 魔法命令调用加载脚本文件,有时候我们也会调用加载我们自己写包下面的模块,那此时我们该如何在jupyter中调用呢?其实很简单,并且我们不在需要使用%run这样的魔法命令。具体模块文件如下:
my_module就是包,如果你想让你的文件成为一个包,那么最快最简单的方法就是在文件中创建一个空的起名叫__init__.py的文件,FirstML就是my_module包下面的一个子模块,同时我们将my_module文件放在和调用包的jupyter文件放在同一路径下,FirstML里面的内容如下所示:
我们不需要使用魔法命令就可以导入包下面某个子模块的所有方法函数或者导入包下面的某个子模块一个方法函数:
2.导入包下面某个子模块下的一个方法函数
顺便提一下:
from 位置1 import 位置2:
1.此时位置1可以是包,那么对应的位置2就表示子模块,你可以选择某一个子模块,也可以使用*导入包下的所有子模块;
import 位置1:
1.此时的位置1,只能是包或者是包下面的某一个模块,不能再具体的深入下去了,就上面例子来说使用“import my_module.FirstML.my_predict”会抛出"ModuleNotFoundError: No module named 'my_module.FirstML.my_predict'; 'my_module.FirstML' is not a package"的异常。
%time系列
应用场景:
我们常常会测试某条代码或者某段代码算法性能,然后对比,选择性能好的代码段。
此时jupyter为我们提供了一个%time的魔法命令,当然这个是一系列的魔法命令。
这段话其实执行的很快,但是为了在统计意义上结果尽量准确,%time会为我们自动运行1000次,然后取最快的3次结果取平均。这里需要注意一点自动为代码循环多少次是由jupyter notebook所决定的,我们可以尝试下面代码:
此时可以查看出jupyter只为我们循环了一次代码(因为代码执行一遍的时候相对较长)。那我们在试试将代码中循环的值变的小一点:
此时jupyter为我们运行了100000万次。
但是上面代码有明显的局限性,%timeit后面只能接一句代码,如果我想测试一段代码的性能该怎么办呢?我们只需要在jupyter cell中开头使用%%timeit(也叫区域命令符)魔法命令:
这段代码和上面列表生成式的代码是一样的,但是使用for训练的明显要比使用Python列表生成式的要慢一些,Python对列表生成式进行了优化。
但是有些时候,比如深度学习模型的时候,往往需要很长时间,这个时候,我们可能不想jupyter帮我们执行多次,就想要执行一次,我们可以使用另外一种魔法命令%time:
那这里有一个问题,在视频中有CPU时间,但是在我的电脑中测试的时候并没有,只有wall time人类感知的时间,他们的区别:有些时候我们可能使用一些多线程的算法,那么在这种情况下我们的wall time < CPU time的,这是因为CPU time是多个核运行时间同时相加的结果,而wall time是真正的物理世界中流逝的时间。
可以看出执行一次所消耗的事件998 μs,比上面的慢很多,这是因为我们只执行了一次循环,而上面执行了1000次取3次最快的时间然后取平均值,这里也就显示出了一个问题,测试一次时间是不稳定的,当我们再执行一次的时候:
所以科学的查看性能的话,不应该只用一次时间,应该多次测量,采用统计学的方式,但有时候我们可能只想大概感知一下这个时间,并不需要这个时间的具体值所以我们仅仅跑一次就足够了,还有一种情况,我们可能花费大量的时间来训练一个机器学习算法,这种情况下只想知道大概跑了多少小时,也只需要一次测量就足够了。
当然我们也可以进行区域化:
这里可能有一个陷阱:
%timeit会将后面的代码运行多次,但是如果后面的代码运行多次效率是不同的话,这个测量的结果会有很大的偏差,具体例子如下:
接下来,我们重新生成10万个随机数:
重新测量一次:
这是因为对Python语言来说,sort这个排序函数是有优化的,对于一个已经排好序的数组,sort可以非常快的完成这个排序动作,而对于一个乱序的数组那么就可能需要更复杂的算法进行排序。这样就不能通过多次测量来体现出真正的性能。
%lsmagic
调用相应魔法命令文档
本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!