Cython与C函数的结合
技术背景
在前面一篇博客中,我们介绍了使用Cython加速谐振势计算的方法。有了Cython对于计算过程更加灵活的配置(本质上是时间占用和空间占用的一种均衡),及其接近于C的性能,并且还最大程度上的保留了Python的编程语法特点,因此Cython确实是值得Python编程爱好者学习的一种加速手段。这里我们要介绍的是Cython与C语言相结合的一种方案,可以直接在pyx文件中加载C语言代码。
测试场景
我们测一个非常简单的场景————归约求和:
\]
当然了,像这种基本运算,在Numpy中已经优化的非常极致了。所以,这里我们并不是要展现Cython在性能上的优势,而是Cython对于C语言和Python语言两者的兼容性。首先我们用C语言实现一个归约求和的简单函数:
// array_sum.c
double reduce_sum(int arr_len, double* arr){
double s=0.0;
int i;
for (i=0; i<arr_len; i++){
s = s + *arr;
arr++;
}
return s;
}
这里我们使用了一个指针数组,然后用for循环进行遍历计算。在Cython中,我们可以使用extern来直接加载C语言中的这个函数:
# test_pointer.pyx
import numpy as np
cimport numpy as np
cdef extern from "array_sum.c":
double reduce_sum(int arr_len, double* arr)
cpdef rsum(int arr_len, np.ndarray[np.float64_t, ndim=2, mode="c"] arr):
cdef:
double* arr_ptr = <double *>arr.data
double res = 0.0
res = reduce_sum(arr_len, arr_ptr)
return res
这里加载了C语言中的reduce_sum函数,然后以Cython中定义的rsum函数作为一个接口,将传入的numpy数组的内存地址作为指针传给C语言中写好的函数。然后需要对这个pyx文件进行编译构建:
$ cythonize -i test_pointer.pyx
编译完成后会在当前路径下生成*.c文件和*.so文件:
$ ll | grep test_pointer
-rw-r--r-- 1 root root 374450 Jul 25 14:52 test_pointer.c
-rwxr-xr-x 1 root root 234848 Jul 25 14:52 test_pointer.cpython-37m-x86_64-linux-gnu.so*
-rw-r--r-- 1 root root 347 Jul 25 15:02 test_pointer.pyx
调用Cython函数
我们可以开启一个Ipython,或者直接在Python脚本文件中调用Cython函数:
In [1]: import numpy as np
In [2]: from test_pointer import rsum
In [3]: num=10000
In [4]: x=np.random.random((num,num))
In [5]: x.shape
Out[5]: (10000, 10000)
In [6]: %timeit s=np.sum(x)
38.3 ms ± 254 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [7]: %timeit rs=rsum(num*num,x)
51.7 ms ± 302 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [15]: np.sum(x)
Out[15]: 50003980.32921535
In [17]: rsum(num*num, x)
Out[17]: 50003980.32921728
经过测试,确实可以在Python中调用这个C语言实现的函数。当然,前面也提到过,Numpy对于这个简单的求和计算已经优化的非常好了,所以这里没有体现出性能上的优势,这里更多的是演示一个方法。
总结概要
这篇文章介绍了Python-Cython-C三种语言的简单耦合,以Cython为中间接口,实现Python数据传到C语言的后端执行相关计算。这就相当于可以在Python中调用C语言中的指针功能来进行跨维度的数组运算,至于性能依然存在优化空间,这里仅仅做一个简单的功能演示。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/cython-c.html
作者ID:DechinPhy
更多原著文章:https://www.cnblogs.com/dechinphy/
请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
Cython与C函数的结合的更多相关文章
- Cython: 快速入门
1. Cython是什么? 它是一个用来快速生成Python扩展模块(extention module)的工具,语法是Python和c的混血.在Cython,C里的类型,如int,float,long ...
- cython教程
.写测试代码: zhouhh@zhouhh-home:~$ vi test.pyx [python] view plaincopy def sayhello(char* str): if str == ...
- Cython的用法以及填坑姿势
因为项目需要,需要优化已有的Python代码.目前Python代码的执行过程是将Python代码转变成一行行指令,然后解释器解释指令的执行,调用到C代码层.如果去掉指令解释这个阶段,直接进入C代码层, ...
- Cython 一篇通
Cython的类型 1 类型定义 1.1 定义一个C变量: 1.1.1 在Cython里定义一个C变量和C语言类似,不同的地方就是在声明的最前面要加上cdef,另外,末尾不用加分号";“如: ...
- [译]学习IPython进行交互式计算和数据可视化(六)
第五章:高性能并行计算 一个反复被提及的反对使用Python进行高性能数值计算的言论是这种语言是动态解释型的,速度太慢.一种编译型低级语言,如C,能提供比它快几个数量级的运算速度.我们在第三章--使用 ...
- python可以提高程序执行速度N倍你知道吗?
1.1.Numba的约5分钟指南 Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码.使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numb ...
- python 各种开源库
测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. 链接 sel ...
- 让Python代码更快运行的 5 种方法
不论什么语言,我们都需要注意性能优化问题,提高执行效率.选择了脚本语言就要忍受其速度,这句话在某种程度上说明了Python作为脚本语言的不足之处,那就是执行效率和性能不够亮.尽管Python从未如C和 ...
- Python测试 ——开发工具库
Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...
- 使用python创建生成动态链接库dll
如今,随着深度学习的发展,python已经成为了深度学习研究中第一语言.绝大部分的深度学习工具包都有python的版本,很多重要算法都有python版本的实现.为了将这些算法应用到具体工程中,这些工具 ...
随机推荐
- Django——基于forms组件和ajax的注册功能
path('register/',views.register) #注册的form表单 from django import forms from django.forms import widget ...
- nginx37条优化
nginx优化: 1. cpu:核心配置 方法1: worker_processes auto; 自动调用[推荐] 方法2: worker_processes 4; 手工配置 检查CPU核心:yum ...
- 修复Apache Log4j 2 远程代码执行漏洞jar包(jdk8编译)
Apache Log4j2是一个基于Java的日志记录工具.该工具重写了Log4j框架,并且引入了大量丰富的特性.该日志框架被大量用于业务系统开发,用来记录日志信息.大多数情况下,开发者可能会将用户输 ...
- LeetCode 719. 找出第 k 小的距离对 (Java)
题目: 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入:nums = [1,3,1]k = 1输出:0 解释 ...
- Android开发基础——真机测试错误,ADB启动不了,程序安装不了,the connection to adb is down,INSTALL_CANCELED_BY_USER...
在Android开发中,无论是真机测试还是AVD测试,都会报出这些错误.在这里,我会详细说明一下怎么会出现这些错误的,然后要怎么样才能解决这些错误. 错误一: The connection to ad ...
- 项目管理--PMBOK 读书笔记(11)【项目风险管理】
1.风险分解结构(RBS): RBS 有两个含义,一个是资源分解结构(Resource),一个是风险分解结构(Risk). 1)技术风险 2)管理风险 3)商业风险 4)外部风险 2.核对单 核对 ...
- MySQL BETWEEN AND包含边界值
select count(1) from table_a where my_date between '20230715' and '20230717'; 上面的SQL我们发现只统计了20230715 ...
- 如何去掉安装IDEA生成的鼠标右键
IDEA去掉右键 在安装IDEA或其它Intellij软件时,因为整个安装流程都是英文的环境,有童鞋稍不注意,就会把Intellij系列软件自动生成鼠标右键给选上 但问题来了,Intellij系列软件 ...
- 有点东西,template可以直接使用setup语法糖中的变量原来是因为这个
前言 我们每天写vue3代码的时候都会使用到setup语法糖,那你知道为什么setup语法糖中的顶层绑定可以在template中直接使用的呢?setup语法糖是如何编译成setup函数的呢?本文将围绕 ...
- http请求方式-CloseableHttpClient
http请求方式-CloseableHttpClient import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObjec ...