如何用如何用C代码给代码给Python写扩展库写扩展库(Cython)
之前一篇文章里提到了利用Cython来编译Python,这次来讲一下如何用Cython给Python写扩展库。
两种语言混合编程,其中最重要的是类型的传递。
我们用一个简单的例子进行入门:这次的目标是用C语言写一个Numpy的加法和元素相乘模块。在本例中,Numpy的array被
传入到C语言模块内,变成了二维数组。
1. 头文件main.h:
#ifndef _MAIN_H
#define _MAIN_H
void plus(double *a, double *b, double *r, int n, int m); // 矩阵加法
void mul(double *a, double *b, double *r, int n, int m); // 矩阵按元素相乘
void main(double *a, double *b, double *r, int n, int m, int times); // 用于测试的main函数
#endif
2. 把主要代码写在main.c中:
#include "main.h"
/***********************************
* 矩阵的加法
* 利用数组是顺序存储的特性, *
* 通过降维来访问二维数组! *
* r
***********************************/
void plus(double *a, double *b, double *r, int n, int m)
{
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
*(r + i*m + j) = *(a + i*m + j) + *(b + i*m + j);
}
}
/***********************************
* 矩阵的按元素乘法
* 利用数组是顺序存储的特性, *
* 通过降维来访问二维数组! *
* r
***********************************/
void mul(double *a, double *b, double *r, int n, int m)
{
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
*(r + i*m + j) = *(a + i*m + j) * *(b + i*m + j);
}
}
/***********************************
* main函数
* 利用数组是顺序存储的特性, *
* 通过降维来访问二维数组! *
* r
***********************************/
void main(double *a, double *b, double *r, int n, int m, int times)
{
int i;
// 循环times次
#pragma omp parallel for
for (i = 0; i < times; i++)
{
// 矩阵的加法
评论0