Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 835|回复: 0

[默认分类] [转]IPython Notebook简介1

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-27 16:47:20 | 显示全部楼层 |阅读模式
    原文:http://hyry.dip.jp/tech/slice/slice.HTML/35
      

      
       
       
        python Notebook简介1
       
         作者 :
         RY    标签:
         cython ipython-notebook
         
         
         IPython notebook目前已经成为用Python做教学、计算、科研的一个重要工具。本文介绍IPython notebook的一些基本用法,以及如何使用它调试Cython程序。
         
       
       
      


      
       
       
         
         IPython Notebook使用浏览器作为界面,向后台的IPython服务器发送请求,并显示结果。在浏览器的界面中使用单元(Cell)保存各种信息。Cell有多种类型,经常使用的有表示格式化文本的Markdown单元,和表示代码的Code单元。
         每个代码单元都有一个输出区域,在Code单元中输入代码,按 Shift-Enter 将运行此代码,代码中最后一个表达式的值将输出区域显示。如果希望屏蔽输出,可以在最后一条语句之后添加一个分号:”;”。此外,代码中还可以使用print语句在输出区域中显示信息。
         在Markdown单元中还可以直接使用Html和javascript。
          
          数学公式
          在Markdown单元中可以使用LaTeX表示数学公式,例如。数学公式的显示使用MathJax,缺省情况下,MathJax从网络上下载,如果希望离线使用它,需要在IPython Notebook中输入如下代码,把MathJax安装到本地磁盘中:
          
            
          
    1. from IPython.external.mathjax import install_mathjax
    2. install_mathjax()
    复制代码

            
          
          Code单元的输出也可以显示为数学公式,例如在单元中输入如下代码,将显示为数学公式:
          
            
          
    1. from IPython.display import Latex
    2. Latex(r"$\sqrt{x^2+y^2}$")
    复制代码

            
          
          
          
          
          SymPy的表达式也可以显示为LaTex,例如:
          
            
          
    1. %load_ext sympyprinting
    2. from sympy import *
    3. x, y = symbols("x,y")
    4. sqrt(x**2+y**2)
    复制代码

            
          
          
          
          
          以%开头的为IPython的命令(Magic Command),这里通过%load_ext命令载入sympyprinting扩展插件,载入此插件之后,所有的SymPy表达式都显示为数学公式。
          
          
          各种显示
          IPython.display模块中提供了许多显示Python返回值的类,例如下面的代码用Image类显示”python.png”图片,缺省路径为Notebook文件所在的目录:
          
            
          
    1. from IPython.display import Image
    2. Image(filename="python.png")
    复制代码

            
          
          Image还可以用来显示表示图像的字符串。例如下面的代码通过cv2的imencode()将NumPy数组转换为一个表示PNG图像数据的数组,然后将此数组转换为字符串之后通过Image()将显示为图像:
          
            
          
    1. import cv2
    2. import numpy as np
    3. from IPython.display import Image
    4. img = np.random.randint(0,255,(250,250,3))
    5. cv2.blur(img, (11,11), img)
    6. r, dat = cv2.imencode(".png",img)
    7. Image(dat.tostring())
    复制代码

            
          
          
          
          
          此外,还可以通过HTML和Javascript将Python代码的输出显示为Html,或者作为Javascript运行。
          
            
          
    1. from IPython.display import Javascript
    2. Javascript("alert("ok")")
    复制代码

            
          
          将在浏览器中运行Javascript代码。
          
          
          Magic命令
          IPython中Magic命令有两种执行方式,以%开始的命令被称为行命令,它只对单行有效,以%%开头的为单元命令,它放在单元的第一行,对整个单元有效。例如timeit命令可以快速测试代码的执行效率,它可以作为行命令或者单元命令。
          
            
          
    1. %timeit 1 + 1
    2. %timeit 1.0 + 1.0
    3. %timeit "1" + "1"
    复制代码

            
          
          
            
          
    1. 10000000 loops, best of 3: 52 ns per loop
    2. 10000000 loops, best of 3: 53.4 ns per loop
    3. 10000000 loops, best of 3: 50.9 ns per loop
    复制代码

            
          
          
            
          
    1. %%timeit
    2. s = 0
    3. for i in xrange(100):
    4.     s += i
    复制代码

            
          
          
            
          
    1. 100000 loops, best of 3: 11 us per loop
    复制代码

            
          
          每个Magic命令都可以指定参数,可以输入timeit?查看其帮助文档。下面让我们看看一些常用的Magic命令。
          %pylab命令将载入numpy和pylab,并且将这两个模块中的名字载入到全局名字空间中。缺省参数时,它使用matplotlib的缺省界面库显示图表,如果带inline参数则将图表作为图像插入到Notebook中。使用界面库显示图像时可以使用交互工具,而将图表直接插入到Notebook中则有利于编写文档。
          下面的例子,plot和random是从pylab和numpy中载入的。
          
            
          
    1. %pylab inline
    2. plot(random.randn(100));
    复制代码

            
          
          
            
          
    1. Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].
    2. For more information, type "help(pylab)".
    复制代码

            
          
          
          
          
          %load可以从文件或者网址载入代码到一个新的单元中,例如下面载入某个matplotlib的示例程序,并执行:
          
            
          
    1. %load http://matplotlib.org/mpl_examples/pylab_examples/histogram_demo.py
    复制代码

            
          
          
            
          
    1. #!/usr/bin/env python
    2. import numpy as np
    3. import matplotlib.mlab as mlab
    4. import matplotlib.pyplot as plt
    5. mu, sigma = 100, 15
    6. x = mu + sigma*np.random.randn(10000)
    7. # the histogram of the data
    8. n, bins, patches = plt.hist(x, 50, normed=1, facecolor="green", alpha=0.75)
    9. # add a "best fit" line
    10. y = mlab.normpdf( bins, mu, sigma)
    11. l = plt.plot(bins, y, "r--", linewidth=1)
    12. plt.xlabel("Smarts")
    13. plt.ylabel("Probability")
    14. plt.title(r"$\mathrm{Histogram\ of\ IQ:}\ \mu=100,\ \sigma=15$")
    15. plt.axis([40, 160, 0, 0.03])
    16. plt.grid(True)
    17. plt.show()
    复制代码

            
          
          
          
          
          %prun用于代码的执行性能分析,可以作为行命令和单元命令使用。下面的程序分析numpy.linalg.det()的性能:
          
            
          
    1. %%prun
    2. for i in xrange(100):
    3.     linalg.det(random.rand(10,10))
    复制代码

            
          
          其输出如下:
          
            
          
    1. 3402 function calls in 0.096 seconds
    2. Ordered by: internal time
    3. ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    4.    100    0.032    0.000    0.091    0.001 linalg.py:1560(slogdet)
    5.    300    0.022    0.000    0.022    0.000 {method "reduce" of "numpy.ufunc" objects}
    6.    200    0.011    0.000    0.012    0.000 numeric.py:167(asarray)
    7.    100    0.006    0.000    0.006    0.000 linalg.py:84(_realType)
    8.    100    0.005    0.000    0.005    0.000 linalg.py:151(_assertRank2)
    9.    ...
    复制代码

            
          
          %load_ext载入IPython的扩展模块,通过它可以载入更多的Magic命令。下面我们载入cythonmagic模块,并使用%%cython命令编译一个高效的频率统计函数count()。
          
            
          
    1. %load_ext cythonmagic
    复制代码

            
          
          
          
          测试Cython代码
          Cython的代码基本和Python的代码类似,但是可以使用类型声明,Cython可以使用这些类型声明产生更高效的C语言代码,并编译成Python的扩展模块。使用%%cython命令简化了编译扩展模块的过程,它会自动创建C语言程序,编译并载入。由于扩展模块无法卸载,因此IPython采用的策略是每次编译不同的代码都会产生一个全新的扩展模块。方便我们不退出Python环境即可运行新的代码。
          
            
          
    1. %%cython
    2. def count(list data):
    3.     cdef:
    4.         dict result = {}
    5.         int i, length = len(data)
    6.         object item
    7.     for i in range(length):
    8.         item = data[i]
    9.         if item in result:
    10.             (<list> result[item]).append(i)
    11.         else:
    12.             result[item] = [i]
    13.     return result
    复制代码

            
          
          下面是count()的Python版本。
          
            
          
    1. from collections import defaultdict
    2. def countpy(data):
    3.     result = defaultdict(list)
    4.     for i,item in enumerate(data):
    5.         result[item].append(i)
    6.     return result
    复制代码

            
          
          先测试二者的结果是否相同:
          
            
          
    1. import random
    2. data = [random.randint(0,100) for _ in xrange(10000)]
    3. count(data) == countpy(data)
    复制代码

            
          
          
            
          
    1. True
    复制代码

            
          
          然后测试它们的执行速度,可以看出Cython版本比Python的要快2倍多。在这个测试中,Cython程序也同样使用列表和字典等对象,但是由于可以直接调用Python的C API,因此Cython版本的效率能提高几倍。如果只是单纯的数值运算,Cython能将程序提升到与C语言相近的速度。
          
            
          
    1. %timeit countpy(data)
    2. %timeit count(data)
    复制代码

            
          
          
            
          
    1. 100 loops, best of 3: 4.52 ms per loop
    2. 1000 loops, best of 3: 1.8 ms per loop
    复制代码

            
          
          
         
       
       
      
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-26 10:39 , Processed in 0.398737 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表