美文网首页
cython的使用加速计算

cython的使用加速计算

作者: LuDon | 来源:发表于2019-01-14 10:42 被阅读15次

Python的使用具有以下优点:

  • 方便
  • 调用c/c++库方便

例子:

# dot_python.py
import numpy as np

def naive_dot(a, b):
    if a.shape[1] != b.shape[0]:
        raise ValueError('shape not matched')
    n, p, m = a.shape[0], a.shape[1], b.shape[1]
    c = np.zeros((n, m), dtype=np.float32)
    for i in xrange(n):
        for j in xrange(m):
            s = 0
            for k in xrange(p):
                s += a[i, k] * b[k, j]
            c[i, j] = s
    return c

矩阵是保存在numpy.ndarray中的,计算速度比c/c++慢很多,使用cython实现:

# dot_cython.pyx
import numpy as np
cimport numpy as np
cimport cython

@cython.boundscheck(False)
@cython.wraparound(False)
cdef np.ndarray[np.float32_t, ndim=2] _naive_dot(np.ndarray[np.float32_t, ndim=2] a, np.ndarray[np.float32_t, ndim=2] b):
    cdef np.ndarray[np.float32_t, ndim=2] c
    cdef int n, p, m
    cdef np.float32_t s
    if a.shape[1] != b.shape[0]:
        raise ValueError('shape not matched')
    n, p, m = a.shape[0], a.shape[1], b.shape[1]
    c = np.zeros((n, m), dtype=np.float32)
    for i in xrange(n):
        for j in xrange(m):
            s = 0
            for k in xrange(p):
                s += a[i, k] * b[k, j]
            c[i, j] = s
    return c

def naive_dot(a, b):
    return _naive_dot(a, b)

看起来和Python的差不多,区别在于:

  • cython程序的扩展名为.pyx
  • cimport是cython中用来引入.pxd文件的命令,可以理解为c/c++中写声明的头文件。
  • @cython.boundscheck(False) 和 @cython.wraparound(False) 两个修饰符用来关闭 Cython 的边界检查
  • cython的函数定义使用cdef,并指定所有参数和返回值的指定类型。例如
 cdef int my_min(int x, int y):
     return x if x <= y else y

cython程序需要先编译在调用,流程如下

  • cython编译器把cython代码编译成调用了Python源码的c/c++代码
  • 把生成的代码编译成动态链接库
  • Python解释器载入动态链接库
    要完成前两步,需要:
# setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy
setup(ext_modules = cythonize(Extension(
    'dot_cython',   # 动态链接库的名字
    sources=['dot_cython.pyx'],  
    language='c',
    include_dirs=[numpy.get_include()],
    library_dirs=[],
    libraries=[],
    extra_compile_args=[],
    extra_link_args=[]
)))

然后需要执行以下命令就可以把cython程序编译成动态链接库了

python setup.py build_ext --inplace

运行完之后,当前目录就多出了dot_cython.c和dot_cython.so。前者是生成的c程序,后者是编译好了的动态链接库。

相关文章

  • cython的使用加速计算

    Python的使用具有以下优点: 方便 调用c/c++库方便 例子: 矩阵是保存在numpy.ndarray中的,...

  • Cython:加速OpenGL

    本文主要介绍如何使用Cython加速OpenGL,涉及到glad头文件的引入和编译,以及PyQt5或者PySide...

  • cython编译报错

    在使用python调用C程序时,可以使用cython库。 背景知识 一、Cython是什么? Cython是一个编...

  • Cython:使用C语言来加速Python

    前言 Python语言易用,开发效率高,适用范围广,这些优点是我们经常提起的,几乎做到了家喻户晓吧。但Python...

  • Cython-bbox如何安装

    Cython bbox广泛应用于目标检测任务,专门针对Faster RCNN使用。 Cython-bbox一般无法...

  • python文件编译成so介绍

    方法一:使用cython将py文件编译成so文件 环境准备安装 cython,以及 gcc 编写测试脚本 test...

  • Cython

    转载Cython基本用法: 在使用Cython编译Python代码时,务必要安装C/C++编译器,本文是直接安装了...

  • Cython 基本使用

    cython 本质上是写cython 语言,然后通过Cython 工具转化为C代码。并且转化的C代码生成的动态链接...

  • Cython系列教程:三. 使用静态类型来加速你的代码

    1 前言 上一主题中,我们介绍了如何构建Cython代码,对于一般的python代码,都可以使用cython对其进...

  • Cython:解决BufferError: Object is

    在使用Cython时,碰到了BufferError: Object is not writable.错误,下面介绍...

网友评论

      本文标题:cython的使用加速计算

      本文链接:https://www.haomeiwen.com/subject/rxhddqtx.html