Python:实用的IPython(一种交互式开发环境)

用习惯了CentOS突然又用Windows,写Python想在控制端写怎么办?别急,一招教你在Windows终端写出一手舒服的代码!
欢迎光临,我的主页。更多干货,等你来学:
不许代码码上红
警句:莫道君行早,更有早行人。

文章目录

    • 一、什么是IPython
    • 二、IPython标准键盘快捷键表
    • 三、 What's 魔术命令?Oh,GOOD!!!
      • 1、普通的魔术命令
      • 2、与操作系统的交互
    • 四、shell命令
    • 五、IPython的目录书签系统
      • 1、什么是IPython目录书签系统?
      • 2、定义一个书签
      • 3、解决书签冲突问题
      • 4、查看所有书签
    • 六、作为软件开发工具
      • 1、交互式调试器
      • 2、测试代码执行时间
        • %time:
        • %timeit:
      • 3、性能分析
        • Profile 和 cProfile
    • 七、IPython的个性化配置

一、什么是IPython

说到IPython你肯定会奇怪,Python前面怎么多了一个“I”?当然,如果你对wxPython有了解的话也就见怪不怪了。IPython 是一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数。
IPython 是基于BSD 开源的。
IPython 为交互式计算提供了一个丰富的架构,包含:

1、强大的交互式 shell Jupyter 内核
2、交互式的数据可视化工具
3、灵活、可嵌入的解释器
4、易于使用,高性能的并行计算工具

二、IPython标准键盘快捷键表

快捷键 说明
(ctrl+p) or 上箭头键 后向搜索命令历史中以当前输入的文本开头的命令
(ctrl+n) or 下箭头键 前向搜索命令历史中以当前输入的文本开头的命令
ctrl+r 按行读取的反向历史搜索
ctrl+shift+v 从剪切板黏贴文本
ctrl +c 中止当前正在执行的代码
ctrl+a 将光标移动到行首
ctrl+e 将光标移动到行尾
ctrl+k 删除从光标开始到行尾的文本
ctrl+u 清除当前行所有文本
ctr+f 将光标向前移动一个字符
ctrl+b 将光标向后移动一格字符
ctrl+l 清屏

三、 What’s 魔术命令?Oh,GOOD!!!

1、普通的魔术命令

IPython中有一些特殊的命令(被称为魔术命令(Magic Command)),它们有的为常见任务提供便利,有的则能使你轻松控制IPython系统的行为。魔术命令是以百分号%为前缀的命令。
常见的魔术命令:

命令 说明
%quickref 显示IPython的快速参考
%magic 显示所有魔术命令的详细文档
%debug 从最新的异常跟踪的底部进入交互式调试器
%hist 打印命令的输入(可选的输入)历史
%pdb 在异常发生后自动进入调试器
%paste 执行剪切板中的Python代码
%cpaste 打开一个特殊提示符以便手工黏贴待执行的Python代码
%reset 删除interactive命令空间中的所有变量
%time statement 计算一段代码的执行时间
%timeit statement 自动选择重复和循环次数计算一段代码的执行时间。

2、与操作系统的交互

IPython另一个重要的特点是它跟操作系统的shell结合的非常紧密。
跟系统相关的魔术命令:

命令 说明
!cmd 在系统shell中执行cmd
output=!cmd args 执行cmd,并将stdout放在output中
%alias alias_name cmd 为系统shell命令定义别名
%bookmark 使用IPython的目录书签系统
%cd directory 将系统工作目录更改为directory
%pwd 返回系统的当前工作目录
%pushed directory 将当前目录入栈,并转向目标目录
%popd 弹出栈顶目录,并转向该目录
%dirs 返回一个含有当前目录栈的列表
%dhist 打印目录访问历史
%env 以dict形式返回系统环境变量

四、shell命令

python shell不是特指某一项命令,而是一种命令行环境,我们可以在shell里面调用库以及执行语句,常见的有ipython环境。
在IPython中,以感叹号(!)开头的命令行表示其后的所有内容需要在系统shell中执行。
例如:另外再启动一个Python编译器:

!python

Python:实用的IPython(一种交互式开发环境)_第1张图片

五、IPython的目录书签系统

1、什么是IPython目录书签系统?

IPython有一个简单的目录书签系统,它可以帮助你很快速地写出以前在IPython中写过的命令。
例如:
在这里插入图片描述
因为之前执行过“!python”,所以借助目录书签系统很快就会显示出来。

2、定义一个书签

定义一个书签example在目录\User\dell下,输入cd example便可以使用这些书签了:
Python:实用的IPython(一种交互式开发环境)_第2张图片

3、解决书签冲突问题

如果书签与当前工作目录中的某个目录名冲突,可以通过-b标记(覆盖)使用目录书签。

4、查看所有书签

%bookmark -l

Python:实用的IPython(一种交互式开发环境)_第3张图片

六、作为软件开发工具

1、交互式调试器

IPython的调试器增强了pdb,如Tab自动完成、语法高亮、为异常追踪的每条信息添加上下文参考。调试代码的最佳时机之一就是在错误刚刚发生那一会儿。
命令(在异常发生后马上输入):

%debug

将会调用那个“事后”调试器,并直接跳转到异常发生的那个栈频(stack frame)。

2、测试代码执行时间

%time:

如果使用内置的time模块里面的time.clock和time.time函数手工测试代码运行的时间,需要编写这样一些代码,十分的繁琐:

import time
start=time.time()
for i in range(x):
	#需要执行的代码
	print("hello,world!")
	elapsed_per=(time.time()-start)/x

用IPython的魔术命令%time来测试代码执行时间:
Python:实用的IPython(一种交互式开发环境)_第4张图片
可是,多次执行后我们发现Wall time时会发生变化的。所以,%time计算的时间还是不太准确。
Python:实用的IPython(一种交互式开发环境)_第5张图片

%timeit:

在大型应用程序的数据分析中,像%time出现的微小的时间不准确现象是会累积的,对于那些执行时间非常短的分析语句和函数而言,%timeit是非常有用的。
Python:实用的IPython(一种交互式开发环境)_第6张图片

3、性能分析

代码的性能分析和代码运行时间密切相关,只不过它关注的是耗费时间的位置。

Profile 和 cProfile

在 Python 标准库里面有两个模块可以用来做性能测试。

  1. 一个是 Profile,它是一个纯 Python 的实现,所以会慢一些,如果你需要对模块进行拓展,那么这个模块比较合适。

  2. 第二个是 cProfile,从名字就可以看出这是一个 C 语言的实现版,官方推荐在大多数情况下使用。
    这两者的接口和数据的输出格式是完全一样的,你可以在这两者之间自由的切换。

run方法:
在 cProfile 中,进行性能测试十分简单,只需调用 run 方法,并将需要测试的函数及参数传递给它即可。

import cProfile
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n - 1) + fib(n - 2)


if __name__ == '__main__':
    cProfile.run('fib(3)')

在PyCharm中:
Python:实用的IPython(一种交互式开发环境)_第7张图片

在IPython中:
Python:实用的IPython(一种交互式开发环境)_第8张图片
其中:

  1. ncalls, 函数总共调用次数;
  2. tottime, 这个函数调用总共花费时间;
  3. percall, 每个调用的平均花费时间;
  4. cumtime, 总共累计花费时间;
  5. percall, 每个调用的平均累计时间;
  6. filename:lineno(function), 对应函数信息。

同时,不难发现,在图中耗时几乎都在fib上,而且函数调用数过多,这主要是因为函数是递归调用的,并且会产生很多

冗余分支:多余重复的分支代码(依我的理解)

所以程序需要进行优化
优化方案:

Python 3 里有一个简单的装饰器叫做lru_cache,可以自动的帮你缓存函数的值,而不需要自己手动存储。

优化后:

import cProfile
import functools


@functools.lru_cache(maxsize=None)
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n - 1) + fib(n - 2)
if __name__ == '__main__':
 cProfile.run('fib(30)')

PyCharm中:
Python:实用的IPython(一种交互式开发环境)_第9张图片
IPython中:
Python:实用的IPython(一种交互式开发环境)_第10张图片
fib 函数只调用了 31 次,几乎所有额外的调用都命中了缓存,远远小于前面的调用次数,运行时间也得到了相当明显的提升。
runctx 方法:
在这里插入图片描述
与run方法返回的值一样,另外允许提供一些上下文参数。

七、IPython的个性化配置

一般情况下配置文ipython_config.py件位于(Windows):

D:\python\Lib
site-packages\jupyter_core\tests\dotipython_empty\profile_default

通过配置能够做的事情:
1、修改颜色
2、修改输入输出提示符
3、去掉out提示符跟下一个in提示符之间的空行
4、启用IPython扩展
5、定义自己的魔术命令或者系统别名
专门为某个程序或者项目量身定做配置:

ipython profile create secret_project

你可能感兴趣的:(python,python)