专栏首页人工智能LeadAI快速教程:使用Cython来扩展Python/NumPy库

快速教程:使用Cython来扩展Python/NumPy库

前言

整个快速教程直接上例子,具体对Cython的使用可以看参考文章。以下工作均在Windows 10 + Python 2.7 + NumPy 1.11.0 + Cython 0.24 版本上进行。

正文

准备工作

假设现在我们用C实现了一个可以用在数组上的cos函数,函数原型如下:

// 对in_array中的前size个数求cos值,并存放在out_array对应位置上

void cos_doubles(double * in_array, double * out_array, int size);

那么总共需要4个文件:

cos_doubles.c,C源文件。

cos_doubles.h,C头文件。

_cos_doubles.pyx,Python的C扩展文件。(注意:之所以前面加个"_"下划线,是因为使用Cython编译打包后会对pyx文件生成同名的c文件,为了避免覆盖掉原来的cos_doubles.c文件,此处加个下划线)

setup.py,负责管理编译、打包工作的“配置”脚本。

下面给出4个文件的源代码:

cos_doubles.c

#include "cos_doubles.h"
#include <math.h>
/*  Compute the cosine of each element in in_array, storing the result in
 *  out_array. */
void cos_doubles(double * in_array, double * out_array, int size){
    int i;
    for(i=0;i<size;i++){
        out_array[i] = cos(in_array[i]);
    }
}
cos_doubles.h
#ifndef _COS_DOUBLES_H

#define _COS_DOUBLES_H
void cos_doubles(double * in_array, double * out_array, int size);
#endif

cos_doubles.pyx

""" Example of wrapping a C function that takes C double arrays as input using

    the Numpy declarations from Cython """
# import both numpy and the Cython declarations for numpy
import numpy as np
cimport numpy as np
# if you want to use the Numpy-C-API from Cython
# (not strictly necessary for this example)
np.import_array()
# cdefine the signature of our c function
cdef extern from "cos_doubles.h":
    void cos_doubles (double * in_array, double * out_array, int size)
# create the wrapper code, with numpy type annotations
def cos_doubles_func(np.ndarray[double, ndim=1, mode="c"] in_array not None,
                     np.ndarray[double, ndim=1, mode="c"] out_array not None):
    cos_doubles(<double*> np.PyArray_DATA(in_array),
                <double*> np.PyArray_DATA(out_array),
                in_array.shape[0])

setup.py

from distutils.core import setup, Extensionimport numpyfrom Cython.Distutils import build_ext
setup(
    cmdclass={'build_ext': build_ext},
    ext_modules=[Extension("cos_doubles",
                 sources=["_cos_doubles.pyx", "cos_doubles.c"],
                 include_dirs=[numpy.get_include()])],
)

编译打包

在命令行窗口中进入到上述文件所在同级目录,输入:

>> python setup.py build_ext -i

参数-i表示inplace,即在同级目录下生成Python可调用模块pyd文件。

build过程如下:

build过程

然后可以看见在同级目录下多了两个文件:

_cos_doubles.c,使用Python C-API自动包装生成的C文件。

cos_doubles.pyx,Python可直接调用的module文件,也就是最终我们所需要的东西。

接下来测试一下:

# file: test.py
import cos_doubles
import numpy as np
import matplotlib.pyplot as plt
a = np.linspace(-5, 5, 100)
b = np.empty_like(a)
cos_doubles.cos_doubles_func(a, b)
plt.plot(b)
plt.show
()

运行效果如下图所示:

运行效果

参考资料

[1] SciPy lecture notes: 2.8. Interfacing with C

[2] Working with NumPy

[3] Python中使用C代码:以NumPy为例

[4] Cython学习

本文分享自微信公众号 - 人工智能LeadAI(atleadai),作者:monitor1379

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python根据BM25实现文本检索

    目的 给定一个或多个搜索词,如“高血压 患者”,从已有的若干篇文本中找出最相关的(n篇)文本。 理论知识 文本检索(text retrieve)的常用策略是:用...

    用户1332428
  • 前馈神经网络——深度学习之神经网络核心原理与算法

    因上几次读者反映,公式代码有乱码和不规整的问题,小编有改善哟,这篇文章开始亲们会看到效果的哟~

    用户1332428
  • Python数据分析模块 | pandas做数据分析(一):基本数据对象

    pandas有两个最主要的数据结构,分别是Series和DataFrame,所以一开始的任务就是好好熟悉一下这两个数据结构。 1、Series 官方文档: pa...

    用户1332428
  • 快速教程:使用Cython来扩展Python/NumPy库

    北京 | 深度学习与人工智能研修 12月23-24日 ? 再设经典课程 重温深度学习 正文共2583个字,7张图,预计阅读时间:7分钟。 前言 整个快速教程直接...

    企鹅号小编
  • SAP MM MB1B + 移动类型321,提示:Enter Goods Receipt Number 之分析与对策

    在自己测试的过程中,发现了一个之前从没有遇到过的问题:MB1B 加移动类型321 将质检库存释放到可用库存的事务界面里,输入物料号,数量等信息后,回车,系统弹出...

    会玩SAP的金哥哥
  • Python-入门-09-字符串常见函数(上篇)

    系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3....

    zishendianxia
  • Python中math模块的使用

    这些函数大部分的返回结果是浮点数,在代码中,浮点数小数点后面的位数是有限的,而二进制表示小数时很有可能会出现无限循环的小数,因此浮点数会有精度损失,不过,大多数...

    Python碎片公众号
  • 关于单例设计模式

    2.使用场景:确保某个类有且只有一个对象的常见,避免产生多个对象消耗过多的资源或者某种类型的对象只应该有且只有一个。

    Demo_Yang
  • Python中math模块的使用

    这些函数大部分的返回结果是浮点数,在代码中,浮点数小数点后面的位数是有限的,而二进制表示小数时很有可能会出现无限循环的小数,因此浮点数会有精度损失,不过,大多数...

    用户7886150
  • 如何设计和实现微信公众号关注后48小时内定时给粉丝自动推送发送图文图片或文本消息?

    很多人可能会留意到, 关注了公众号之后,隔一段时间, 公众号会推送消息出来,打开消息后发现这些消息看起来不像人工发送的,应该是设计好的一套关注后的定时推送机制,...

    扫地工程师

扫码关注云+社区

领取腾讯云代金券