Cython(1)--基本概念

2024-08-22 03:38
文章标签 基本概念 cython

本文主要是介绍Cython(1)--基本概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 1. 特点
    • 2. 速度
    • 3 用cython包装(wrapping)c语言

以下全来自于对《Cython:A Guide for Python Programmers》一书的学习

cython最大的作用就是用来加速python代码。

cython是什么:

  • Cython是融合python和c/c++的一种编程语言;
  • cython编译器可以将Cython代码编程成c/c++。然后编译后可以被python当成扩展包进行调用。

Cython的美妙之处在于:它将Python的表达性和动态性与C的裸机性能(bare-metal performance)结合在一起,同时仍然感觉像Python

1. 特点

  • Cython代码里面可以写python代码,也就是说Cython可以理解python代码。
  • 需要用cdef声明变量

2. 速度

总结:

  1. 能用:循环密集、算术密集
  2. 不能用:I/O密集

然后看分析:

速度快,可以看一下对比数据。
在这里插入图片描述

  • 函数调用:fib(0)可以是看做函数调用的时间对比,fib(0)运行时主要消耗在调用相应语言中的函数所需的时间上;运行函数体的时间相对较短。从表1-1中可以看到,Cython生成的代码比调用Python函数快一个数量级,比手工编写的快两倍多.
  • 循环:python中的循环相对c语言来说是非常慢的。加速循环Python代码的一个可靠的方法是找到方法将Python for和while循环移动到已编译的代码中,可以通过调用内置函数,也可以使用类似Cython的东西来完成转换。
  • 数学操作:python在做算术运算的时候是不知道数据类型的,所以还需要去查找,但是c和cyhton是显示声明数据类型的。
  • 堆栈与堆分配:在C级,动态Python对象完全是堆分配的。Python煞费苦心地智能地管理内存,使用内存池并内化常用的整数和字符串。但事实仍然是,创建和销毁对象——任何对象,甚至标量——都会增加处理动态分配内存和Python内存子系统的开销。因为Python浮动对象是不可变的,所以使用Python浮动的操作涉及到创建和销毁堆分配的对象。Cython版本的fib声明所有变量都是堆栈分配的C double。通常,堆栈分配比堆分配快得多。此外,C浮点数是可变的,这意味着for循环体在分配和内存使用方面更有效。

但是,值得注意的是,并不是所有Python代码在使用Cython编译时都能看到巨大的性能改进。前面的fib示例是有意对CPU进行限制的,这意味着所有的运行时都是在CPU寄存器内操作几个变量,几乎不需要移动数据。相反,如果这个函数内存约束(例如,添加两个大数组的元素),I / O绑定(例如,从磁盘读取大型文件),或网络绑定(例如,从一个FTP服务器下载文件),Python之间的性能差异,C, Cython可能显著降低(内存受限操作)或完全消失(I/O密集型或network密集型操作)。

当提高Python的性能是我们的目标时,帕累托原则就对我们有利:我们可以预期,一个程序大约80%的运行时间是由20%的代码造成的。这个原则的一个推论是,如果不进行分析,很难找到那20%。但是没有理由不分析Python代码,因为它的内置分析工具非常简单。在我们使用Cython改善性能之前,获取分析数据是第一步

  • 也就是说,如果我们通过分析确定程序中的瓶颈是由于I/O或网络限制造成的,那么我们就不能指望Cython在性能上有显著的改进

3 用cython包装(wrapping)c语言

python调用c语言的方法。
下面给出的只是其中一种方式,是吧c语言分来开存放,还有一种方式,是写在一个文件里。

c代码:

// cfib.c
double cfib(int n) { int i; double a=0.0, b=1.0, tmp; for (i=0; i<n; ++i) {tmp = a; a = a + b; b = tmp; } return a; 
}
// cfib.h
double cfib(int n);

cython代码:

# wrap_fib.pyx
cdef extern from "cfib.h": double cfib(int n)def fib(n): 
"""Returns the nth Fibonacci number.""" return cfib(n)

最后经过编译就可以在python里面调用了from wrap_fib import fib。cython代码里面需要用定义一个包装(wrapping)函数来返回c定义的函数。

并且,因为Cython语言理解Python,并且可以访问Python的标准库,所以我们可以利用Python的所有强大功能和灵活性。

这篇关于Cython(1)--基本概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095138

相关文章

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3

【Rocketmq入门-基本概念】

Rocketmq入门-基本概念 名词解释名称服务器(NameServer)消息队列(Message Queue)主题(Topic)标签(Tag)生产者(Producer)消费者(Consumer)拉取模式(Pull)推送模式(Push)消息模型(Message Model) 关键组件Broker消息存储工作流程 名词解释 名称服务器(NameServer) 定义: 名称服务器

数据结构的基本概念和术语的一些介绍

数据:是客观事物的符号表示,包括两种:                  数值型(整数,实数)和非数值型(文字,图形,声音 数据元素:是数据的基本单位,通常作为一个整体进行表示。                  与数据的关系:是数据集合的个体 数据项:组成数据元素的不可分割的最小单位。 以上三者的关系:数据>数据元素>数据项                  例如:学生表>个人记录>

【DL--05】深度学习基本概念—函数式模型

函数式模型 函数式模型算是本文档比较原创的词汇了,所以这里要说一下 在Keras 0.x中,模型其实有两种,一种叫Sequential,称为序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相邻关系,跨层连接统统没有。这种模型编译速度快,操作上也比较简单。第二种模型称为Graph,即图模型,这个模型支持多输入多输出,层与层之间想怎么连怎么连,但是编译速度慢。可以看到,Sequentia

【DL--04】深度学习基本概念—data_format

data_format 这是一个无可奈何的问题,在如何表示一组彩色图片的问题上,Theano和TensorFlow发生了分歧,’th’模式,也即Theano模式会把100张RGB三通道的16×32(高为16宽为32)彩色图表示为下面这种形式(100,3,16,32),Caffe采取的也是这种方式。第0个维度是样本维,代表样本的数目,第1个维度是通道维,代表颜色通道数。后面两个就是高和宽了。这种t

【DL--03】深度学习基本概念—张量

张量 TensorFlow中的中心数据单位是张量。张量由一组成形为任意数量的数组的原始值组成。张量的等级是其维数。以下是张量的一些例子: 3 # a rank 0 tensor; this is a scalar with shape [][1. ,2., 3.] # a rank 1 tensor; this is a vector with shape [3][[1., 2., 3.]

【DL--02】深度学习基本概念--符号计算

符号计算 Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都是一个“符号式”的库。 因此,这也使得Keras的编程与传统的Python代码有所差别。笼统的说,符号主义的计算首先定义各种变量,然后建立一个“计算图”,计算图规定了各个变量之间的计算关系。建立好的计算图需要编译以确定其内部细节,然而,此时的计算图还

数据结构 基本概念和述语

数据结构 基本概念和述语数据(data)数据元素(data element)数据项(data item)数据对象(data object)数据结构(data structure)逻辑结构与物理结构逻辑结构物理结构 抽象数据类型(Abstract Data Type, ADT):数据类型:抽象数据类型三元组的定义:抽象数据类型的表示与实现抽象数据类型Triplet的表示和实现: 算法和算法分析

分布式系统的一些基本概念

GitHub:https://github.com/wangzhiwubigdata/God-Of-BigData 关注公众号,内推,面试,资源下载,关注更多大数据技术~大数据成神之路~预计更新500+篇文章,已经更新50+篇~ 分布式 来自csdn,作者:陆小凤 进阶篇来自:bangerlee 作者对部分地方做了订正 目前这系列文章是网络上分布式