01. Python 工具
02. Python 基础
03. Numpy
- Numpy 简介
- Matplotlib 基础
- Numpy 数组及其索引
- 数组类型
- 数组方法
- 数组排序
- 数组形状
- 对角线
- 数组与字符串的转换
- 数组属性方法总结
- 生成数组的函数
- 矩阵
- 一般函数
- 向量化函数
- 二元运算
- ufunc 对象
- choose 函数实现条件筛选
- 数组广播机制
- 数组读写
- 结构化数组
- 记录数组
- 内存映射
- 从 Matlab 到 Numpy
04. Scipy
05. Python 进阶
- sys 模块简介
- 与操作系统进行交互:os 模块
- CSV 文件和 csv 模块
- 正则表达式和 re 模块
- datetime 模块
- SQL 数据库
- 对象关系映射
- 函数进阶:参数传递,高阶函数,lambda 匿名函数,global 变量,递归
- 迭代器
- 生成器
- with 语句和上下文管理器
- 修饰符
- 修饰符的使用
- operator, functools, itertools, toolz, fn, funcy 模块
- 作用域
- 动态编译
06. Matplotlib
- Pyplot 教程
- 使用 style 来配置 pyplot 风格
- 处理文本(基础)
- 处理文本(数学表达式)
- 图像基础
- 注释
- 标签
- figures, subplots, axes 和 ticks 对象
- 不要迷信默认设置
- 各种绘图实例
07. 使用其他语言进行扩展
- 简介
- Python 扩展模块
- Cython:Cython 基础,将源代码转换成扩展模块
- Cython:Cython 语法,调用其他C库
- Cython:class 和 cdef class,使用 C++
- Cython:Typed memoryviews
- 生成编译注释
- ctypes
08. 面向对象编程
09. Theano 基础
- Theano 简介及其安装
- Theano 基础
- Theano 在 Windows 上的配置
- Theano 符号图结构
- Theano 配置和编译模式
- Theano 条件语句
- Theano 循环:scan(详解)
- Theano 实例:线性回归
- Theano 实例:Logistic 回归
- Theano 实例:Softmax 回归
- Theano 实例:人工神经网络
- Theano 随机数流变量
- Theano 实例:更复杂的网络
- Theano 实例:卷积神经网络
- Theano tensor 模块:基础
- Theano tensor 模块:索引
- Theano tensor 模块:操作符和逐元素操作
- Theano tensor 模块:nnet 子模块
- Theano tensor 模块:conv 子模块
10. 有趣的第三方模块
11. 有用的工具
- pprint 模块:打印 Python 对象
- pickle, cPickle 模块:序列化 Python 对象
- json 模块:处理 JSON 数据
- glob 模块:文件模式匹配
- shutil 模块:高级文件操作
- gzip, zipfile, tarfile 模块:处理压缩文件
- logging 模块:记录日志
- string 模块:字符串处理
- collections 模块:更多数据结构
- requests 模块:HTTP for Human
12. Pandas
Cython:Cython 语法,调用其他C库
Cython 语法
cdef 关键词
cdef
定义 C
类型变量。
可以定义局部变量:
def fib(int n):
cdef int a,b,i
...
定义函数返回值:
cdef float distance(float *x, float *y, int n):
cdef:
int i
float d = 0.0
for i in range(n):
d += (x[i] - y[i]) ** 2
return d
定义函数:
cdef class Particle(object):
cdef float psn[3], vel[3]
cdef int id
注意函数的参数不需要使用 cdef 的定义。
def, cdef, cpdef 函数
Cython
一共有三种定义方式,def, cdef, cpdef
三种:
def
- Python, Cython 都可以调用cdef
- 更快,只能 Cython 调用,可以使用指针cpdef
- Python, Cython 都可以调用,不能使用指针
cimport
In [1]:
from math import sin as pysin
from numpy import sin as npsin
In [2]:
%load_ext Cython
从标准 C
语言库中调用模块,cimport
只能在 Cython
中使用:
In [3]:
%%cython
from libc.math cimport sin
from libc.stdlib cimport malloc, free
cimport 和 pxd 文件
如果想在多个文件中复用 Cython
代码,可以定义一个 .pxd
文件(相当于头文件 .h
)定义方法,这个文件对应于一个 .pyx
文件(相当于源文件 .c
),然后在其他的文件中使用 cimport
导入:
fib.pxd, fib.pyx
文件存在,那么可以这样调用:
from fib cimport fib
还可以调用 C++
标准库和 Numpy C Api
中的文件:
from libcpp.vector cimport vector
cimport numpy as cnp
调用其他C库
从标准库 string.h
中调用 strlen
:
In [4]:
%%file len_extern.pyx
cdef extern from "string.h":
int strlen(char *c)
def get_len(char *message):
return strlen(message)
Writing len_extern.pyx
不过 Cython
不会自动扫描导入的头文件,所以要使用的函数必须再声明一遍:
In [5]:
%%file setup_len_extern.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
ext_modules=[ Extension("len_extern", ["len_extern.pyx"]) ],
cmdclass = {'build_ext': build_ext}
)
Writing setup_len_extern.py
编译:
In [6]:
!python setup_len_extern.py build_ext --inplace
running build_ext
cythoning len_extern.pyx to len_extern.c
building 'len_extern' extension
creating build
creating build\temp.win-amd64-2.7
creating build\temp.win-amd64-2.7\Release
C:\Miniconda\Scripts\gcc.bat -DMS_WIN64 -mdll -O -Wall -IC:\Miniconda\include -IC:\Miniconda\PC -c len_extern.c -o build\temp.win-amd64-2.7\Release\len_extern.o
writing build\temp.win-amd64-2.7\Release\len_extern.def
C:\Miniconda\Scripts\gcc.bat -DMS_WIN64 -shared -s build\temp.win-amd64-2.7\Release\len_extern.o build\temp.win-amd64-2.7\Release\len_extern.def -LC:\Miniconda\libs -LC:\Miniconda\PCbuild\amd64 -lpython27 -lmsvcr90 -o "C:\Users\Jin\Documents\Git\python-tutorial\07\. interfacing with other languages\len_extern.pyd"
从 Python
中调用:
In [7]:
import len_extern
调用这个模块后,并不能直接使用 strlen
函数,可以看到,这个模块中并没有 strlen
这个函数:
In [8]:
dir(len_extern)
Out[8]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'__test__',
'get_len']
不过可以调用 get_len
函数:
In [9]:
len_extern.get_len('hello')
Out[9]:
5
因为调用的是 C
函数,所以函数的表现与 C
语言的用法一致,例如 C
语言以 \0
为字符串的结束符,所以会出现这样的情况:
In [10]:
len_extern.get_len('hello\0world!')
Out[10]:
5
除了对已有的 C
函数进行调用,还可以对已有的 C
结构体进行调用和修改:
In [11]:
%%file time_extern.pyx
cdef extern from "time.h":
struct tm:
int tm_mday
int tm_mon
int tm_year
ctypedef long time_t
tm* localtime(time_t *timer)
time_t time(time_t *tloc)
def get_date():
"""Return a tuple with the current day, month and year."""
cdef time_t t
cdef tm* ts
t = time(NULL)
ts = localtime(&t)
return ts.tm_mday, ts.tm_mon + 1, ts.tm_year + 1900
Writing time_extern.pyx
这里我们只使用 tm
结构体的年月日信息,所以只声明了要用了三个属性。
In [12]:
%%file setup_time_extern.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
ext_modules=[ Extension("time_extern", ["time_extern.pyx"]) ],
cmdclass = {'build_ext': build_ext}
)
Writing setup_time_extern.py
编译:
In [13]:
!python setup_time_extern.py build_ext --inplace
running build_ext
cythoning time_extern.pyx to time_extern.c
building 'time_extern' extension
C:\Miniconda\Scripts\gcc.bat -DMS_WIN64 -mdll -O -Wall -IC:\Miniconda\include -IC:\Miniconda\PC -c time_extern.c -o build\temp.win-amd64-2.7\Release\time_extern.o
writing build\temp.win-amd64-2.7\Release\time_extern.def
C:\Miniconda\Scripts\gcc.bat -DMS_WIN64 -shared -s build\temp.win-amd64-2.7\Release\time_extern.o build\temp.win-amd64-2.7\Release\time_extern.def -LC:\Miniconda\libs -LC:\Miniconda\PCbuild\amd64 -lpython27 -lmsvcr90 -o "C:\Users\Jin\Documents\Git\python-tutorial\07\. interfacing with other languages\time_extern.pyd"
测试:
In [14]:
import time_extern
time_extern.get_date()
Out[14]:
(19, 9, 2015)
清理文件:
In [15]:
import zipfile
f = zipfile.ZipFile('07-04-extern.zip','w',zipfile.ZIP_DEFLATED)
names = ['setup_len_extern.py',
'len_extern.pyx',
'setup_time_extern.py',
'time_extern.pyx']
for name in names:
f.write(name)
f.close()
!rm -f setup*.*
!rm -f len_extern.*
!rm -f time_extern.*
!rm -rf build
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论