IPython 中常用的魔法命令

IPython,即 Interactive Python Shell,是一个功能强大多样的交互式的  Python 环境。

大多数都从事有关数据分析、机器学习或者数据科学相关教学的项目时,少不了会使用 Jupyter Notebook 或 Jupyter Lab,而这两款 IDE 的内核就是 IPython。虽然说和 Pycharm 这样的「工程型」 IDE 来说 Jupyter 可能会稍逊一些,并且功能上会有所缺失;但是 IPython 内置的一些魔法命令(Magic Command)本身也让 Jupyter 增添了有趣的体验。

因此本文借此打算谈一谈在使用 Jupyter 时我经常用到的一些 Magic Command。

1、查看内置了哪些 Magic Command

使用%magic可以直接调出有关于魔法命令的详细说明文档,这就等同于vim编辑器中的:help一样。

如果你只是想列出哪些魔法命令我们可以使用,那么可以直接调用%lsmagic进行输出

如果只是查看具体某个魔法命令的用法,那么可以直接在魔法命令之后接上一个?问号,类似于这样%run?

2、终端交互

最开始使用 IPython 时让我比较惊叹的是能够直接、快速地和终端进行交互与操作,虽然可以通过内置的魔法命令%sx%system来执行相对应的 Shell 语句,但我相信更多人都还是比较喜欢使用感叹号!<shell-command>!!<shell-command>来执行。

因此,每当我们想要执行相应的 Shell 语句时,直接可以在 IPython 内即可运行,就像这样:

使用单感叹号时仅仅只是将结果进行输出打印;而使用双感叹号则会将结果以列表的形式返回。返回的结果也能够作为值直接赋值给 Python 环境的变量,就像这样:

除此之外,像一些常用的 Shell 命令也有相应内置的魔法函数,诸如%cd%pwd%ls%cp%rm%man%mv

3、代码交互

使用%run 可以直接将外部的 .py文件运行,最后将结果输出到 IPython 或 Jupyter 界面中。

假设我现在桌面这么一个fib.py文件,其中内容如下:

# -*- coding: utf-8 -*-

import time


def timer(func):
    def wrapper(*args, **kwargs):
        s = time.time()
        f = func(*args, **kwargs)
        e = time.time()
        print(f'total spends: {e-s:.5f}s')
        return f
    return wrapper


def fib(n):
    a, b = 1, 1
    while n > 0:
        a, b = b, a+b
        n -= 1
    return a


@timer
def main():
    for i in range(10):
        print(fib(i), end='\n')


if __name__ == "__main__":
    main()

那么我们可以直接通过%run ~/Desktop/fib.py来直接运行代码:

当然,我们也可以使用%load 直接将外部的代码文件加载到当前的 cell 中,加载之后会自动将加载命令进行注释:

如果你仅仅只是浏览外部代码,但是不需要加载进 cell 中,那么可以直接使用 %pycat 将代码文件以弹框的形式展示:

有时我们事先在 Jupyter 中的 cell 写好了一些代码,这时候发现想将这部分的代码导出,那么我们可以不用复制粘贴,而是使用 %%writefile 命令直接将当前 cell 代码写入到指定的文件中即可:

4、查看当前命名空间存在哪些对象

如果你有使用过 Rstudio(R语言IDE)或 Anaconda 内置的 Spyder,初次使用 Jupyter 时你会对无法查看当前环境中存在的变量或对象而感到无所适从。好在我们可以通过简单的魔法命令来对当前环境中存在的变量或对象进行快速的预览。这里主要用到的是%who*的相关命令。

当环境中存在的变量或对象不算多时,而你对他们又是了如指掌,只是想简单了解一下都有哪些时可以直接使用%who命令,不加任何参数时会返回所有类型的对象,当然你也可以通过指定类型、函数、类等来获取相对应的类型,类似于这样:

a = 'hello, world'
b = 12345

def c():
    return 'foo'

class d:
    def __init__(name):
        self.name = name


%who # 默认返回所有对象
%who str # 返回变量 a
%who int # 返回变量 b
%who function # 返回函数 c
%who type # 返回类 d
%who str int # 返回变量 a 和 b

如果你想以 Python 的列表形式呈现,那么你也可以直接通过%who_ls来进行罗列,它会将环境中的所有对象命名以字符串的形式呈现,最后并将所有字符串以列表的形式返回。

当然,倘若你想要对每个对象的类型以及信息有相对细致的理解,那么我们直接可以使用%whos来进行较为细致的输出。

5、性能测试

在使用 Jupyter 的时候,我们会经常性地去优化我们的代码,或是对我们代码的运行速度进行性能测试,那么也能过相关的魔法命令来快速地实现。

*time*timeit

%time%%time都是用于测试运行一次代码时所消耗的时间,有点类似于使用time.time()来进行计时的用法。

%timeit%%timeit都是用于测试运行多次时所耗费的时间,即是将每一次运行所用的时间进行统计,最后返回相应的结果。

需要注意的是:

  • 当只有一个百分号时,主要是测试单条命令的运行时间或平均耗时,这就意味着在魔法命令之后只能接上单条命令或是用「;」分号进行分隔多条命令;

  • 当有两个百分号时,主要测试的是整个 cell 里面代码的运行时间或平均耗时,这时魔法命令在 cell 中需要单独占一行,然后才是你的代码,这就有点类似于装饰器的样子。

*prun

除了耗时之外,如果你还想看到代码内部执行的耗时情况,可以使用%prun%%prun可以查看语句在执行时所花费的时间。单百分号和双百分号的结果同上面的*time*timeit一致,都是分别对单条和整个 cell 进行测试分析。

结尾

除了魔法命令之外,如果还想提升使用 Jupytur 的体验,那么可以再借助别人已经写好的第三方插件。如果你是用的是 Jupyter Notebook,可以通过  jupyter_contrib_nbextensions 来安装使用;如果你使用的是 Jupyter Lab,那么直接可以通过集成的插件模块进行搜索与安装。

Jupyter 更多时候是用于简单的前期探索与构思,随着项目的开展或者进行更多测试时,Jupyter 在功能上可能就远没有 Pycharm 这类 IDE 齐全了。

作者:100gle,练习时长不到两年的非正经文科生一枚,喜欢敲代码、写写文章、捣鼓捣鼓各种新事物;现从事有关大数据分析与挖掘的相关工作。

赞 赏 作 者

Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。

推荐阅读:

一文读懂高并发情况下的常见缓存问题

用 Django 开发基于以太坊智能合约的 DApp

一文读懂 Python 分布式任务队列 celery

5 分钟解读 Python 中的链式调用

用 Python 创建一个比特币价格预警应用

▼点击成为社区会员   喜欢就点个在看吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值