用习惯了CentOS突然又用Windows,写Python想在控制端写怎么办?别急,一招教你在Windows终端写出一手舒服的代码!
欢迎光临,我的主页。更多干货,等你来学:
不许代码码上红
警句:莫道君行早,更有早行人。
说到IPython你肯定会奇怪,Python前面怎么多了一个“I”?当然,如果你对wxPython有了解的话也就见怪不怪了。IPython 是一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数。
IPython 是基于BSD 开源的。
IPython 为交互式计算提供了一个丰富的架构,包含:
1、强大的交互式 shell Jupyter 内核
2、交互式的数据可视化工具
3、灵活、可嵌入的解释器
4、易于使用,高性能的并行计算工具
快捷键 | 说明 |
---|---|
(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 | 清屏 |
IPython中有一些特殊的命令(被称为魔术命令(Magic Command)),它们有的为常见任务提供便利,有的则能使你轻松控制IPython系统的行为。魔术命令是以百分号%为前缀的命令。
常见的魔术命令:
命令 | 说明 |
---|---|
%quickref | 显示IPython的快速参考 |
%magic | 显示所有魔术命令的详细文档 |
%debug | 从最新的异常跟踪的底部进入交互式调试器 |
%hist | 打印命令的输入(可选的输入)历史 |
%pdb | 在异常发生后自动进入调试器 |
%paste | 执行剪切板中的Python代码 |
%cpaste | 打开一个特殊提示符以便手工黏贴待执行的Python代码 |
%reset | 删除interactive命令空间中的所有变量 |
%time statement | 计算一段代码的执行时间 |
%timeit statement | 自动选择重复和循环次数计算一段代码的执行时间。 |
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形式返回系统环境变量 |
python shell不是特指某一项命令,而是一种命令行环境,我们可以在shell里面调用库以及执行语句,常见的有ipython环境。
在IPython中,以感叹号(!)开头的命令行表示其后的所有内容需要在系统shell中执行。
例如:另外再启动一个Python编译器:
!python
IPython有一个简单的目录书签系统,它可以帮助你很快速地写出以前在IPython中写过的命令。
例如:
因为之前执行过“!python”,所以借助目录书签系统很快就会显示出来。
定义一个书签example在目录\User\dell下,输入cd example便可以使用这些书签了:
如果书签与当前工作目录中的某个目录名冲突,可以通过-b标记(覆盖)使用目录书签。
%bookmark -l
IPython的调试器增强了pdb,如Tab自动完成、语法高亮、为异常追踪的每条信息添加上下文参考。调试代码的最佳时机之一就是在错误刚刚发生那一会儿。
命令(在异常发生后马上输入):
%debug
将会调用那个“事后”调试器,并直接跳转到异常发生的那个栈频(stack frame)。
如果使用内置的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来测试代码执行时间:
可是,多次执行后我们发现Wall time时会发生变化的。所以,%time计算的时间还是不太准确。
在大型应用程序的数据分析中,像%time出现的微小的时间不准确现象是会累积的,对于那些执行时间非常短的分析语句和函数而言,%timeit是非常有用的。
代码的性能分析和代码运行时间密切相关,只不过它关注的是耗费时间的位置。
在 Python 标准库里面有两个模块可以用来做性能测试。
一个是 Profile,它是一个纯 Python 的实现,所以会慢一些,如果你需要对模块进行拓展,那么这个模块比较合适。
第二个是 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)')
- ncalls, 函数总共调用次数;
- tottime, 这个函数调用总共花费时间;
- percall, 每个调用的平均花费时间;
- cumtime, 总共累计花费时间;
- percall, 每个调用的平均累计时间;
- 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中:
IPython中:
fib 函数只调用了 31 次,几乎所有额外的调用都命中了缓存,远远小于前面的调用次数,运行时间也得到了相当明显的提升。
runctx 方法:
与run方法返回的值一样,另外允许提供一些上下文参数。
一般情况下配置文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