`
zuroc
  • 浏览: 1309807 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

pyrex学习笔记

阅读更多
0.
easy_install pyrex

1.写pyrex文件
~/pyrex $ ls
__init__.py  primes.pyx

~/pyrex $ cat primes.pyx
#coding:utf-8

#一个函数
def primes(int kmax):
    cdef int n, k, i
    cdef int p[1000]
    result = []
    if kmax > 1000:
        kmax = 1000
    k = 0
    n = 2
    while k < kmax:
        i = 0
        while i < k and n % p[i] <> 0:
            i = i + 1
        if i == k:
           p[k] = n
           k = k + 1
           result.append(n)
        n = n + 1
    return result


#一种类型
"""
1.
Finalization method: __dealloc__
The counterpart to the __cinit__ method is the __dealloc__ method, which should perform the inverse of the __cinit__ method. Any C data structures that you allocated in your __cinit__ method should be freed in your __dealloc__ method.

2.
http://blog.donews.com/limodou/archive/2004/08.aspx?PageNumber=2
在 Python 中,在一个类定义中引用一个类方法,得到的是一个一般的函数对象。但在 pyrex 中得到的是一个未与类绑定的对象。这样导致的结果是通常使用的classmethod和staticmethod这样的用法在pyrex中不可用。例如,在Python中可以:

    class spam:
        def method(self):
            ...
        method = classmethod(method)

但在 pyrex 中不能使用。你可以在类的外面定义这个方法,然后在类的定义中,将classmethod和staticmethod的结果赋给类的变量。如:

    def Spam_method(cls):
        ...
    class spam:
        method = classmethod(Spam_method)
"""
cdef class Spam:

  cdef int amount

  def __cinit__(self):
    self.amount = 0

  def get_amount(self):
    return self.amount

  def set_amount(self, new_amount):
    self.amount = new_amount

  def describe(self):
    print self.amount, "tons of spam!"

2.编译
pyrexc -r primes.pyx
生成了 primes.c
gcc -O2 -fPIC -shared -o primes.so -I/home/zuroc/include/python2.6  -L/home/zuroc/lib primes.c

3.运行
>>> import primes
>>> primes.primes(10)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
>>> spam=primes.Spam()
>>> spam.get_amount()
0

4.封装现有c函数

"""
http://blog.donews.com/limodou/archive/2004/08.aspx?PageNumber=2

cdef extern from "spam.h":
    int spam_counter
    void order_spam(int tons)

这个cdef extern from子句做了三件事:

   1. 它告诉pyrex设置一个#include语句在生成的C代码中,使用指定的头文件
   2. 它阻止pyrex对下面的代码缩近块中存在的声明生成C的声明代码
   3. 它会认为代码块中所有的声明都是以cdef extern开始的

也就是说,pyrex本身不会去读取指定的头文件,自动分析哪些在头文件中有声明,这个工作需要你去做,你要指定哪些变量或函数已经在头文件中声明了(就是在代码块中进行原型的声明),告诉pyrex不要再为这些变量或函数产生声明C代码了。

每一个pyrex模块都为Python和C名字提供一个模块级的名字空间。不过当你想要封装一些外部的C函数,并以相同的名字提供给用户Python函数时,这样就不方便了。

一种方法是使用C名字规范(c name specification, 就是在一个名字后面跟着一个字符串)来对一个C函数给出不同的python和C名字。例如:

    cdef extern void c_eject_tomto "eject_tomato" (float speed)

...........



通过使用public关键字,可以使得在pyrex内部声明的C变量和函数被外部的C代码(或pyrex模块)使用,例如:
cdef public int spam #公共变量声明


"""
另外一种是

Using cimport to resolve naming conflicts

The cimport mechanism provides a clean and simple way to solve the problem of wrapping external C functions with Python functions of the same name. All you need to do is put the extern C declarations into a .pxd file for an imaginary module, and cimport that module. You can then refer to the C functions by qualifying them with the name of the module. Here's an example:

c_lunch.pxd
cdef extern from "lunch.h":
    void eject_tomato(float) cimport c_lunch

lunch.pyx
def eject_tomato(float speed):
    c_lunch.eject_tomato(speed)

You don't need any c_lunch.pyx file, because the only things defined in c_lunch.pxd are extern C entities. There won't be any actual c_lunch module at run time, but that doesn't matter; the c_lunch.pxd file has done its job of providing an additional namespace at compile time.
分享到:
评论

相关推荐

    Pyrex-0.9.9.tar.gz

    总结一下,Pyrex-0.9.9是一个方便的工具,它让Python程序员能够利用C语言的速度优势,而无需深入学习C的复杂性。在Linux系统上,这个版本已被证实可以顺利安装和使用。虽然在其他操作系统上的兼容性未被明确证实,但...

    pyrex-tools-开源

    虽然 Pyrex 在后来的几年里发展停滞,被 Cython 所取代,但对于学习和理解 Python 扩展模块的编写以及 C 与 Python 交互的方式,Pyrex 仍然具有一定的学习价值。 总结来说,Pyrex-tools 是一套用于 Pyrex 开发的...

    pyrex:无缝容器设置,用于使用OpenEmbeddedYocto项目进行开发

    Pyrex具有以下系统要求: docker或podman python 3.6或更高版本 注意:如果将docker作为snap安装,Pyrex将无法正常运行,因为它将绑定不允许快照访问的安装文件。 请安装非快照版本的apt install docker.io ,例如...

    水辅助激光诱导等离子体背部刻蚀Pyrex7740玻璃

    提出了水辅助激光诱导等离子体背部刻蚀Pyrex7740玻璃的方法, 制备了缩小型十字通道微流控芯片。通过理论分析和加工试验, 研究了激光能量密度和激光加工次数对平均刻蚀深度的影响, 以及刻蚀过程中去离子水的作用。...

    Pyrex玻璃的ICP刻蚀技术研究* (2008年)

    以SF6/Ar为刻蚀气体,采用感应耦合等离子体(ICP)刻蚀Pyrex玻璃,研究气体流量、射频功率对刻蚀速率及刻蚀面粗糙度的影响。采用正交实验方法找出优化的实验参数,得到Pyrex玻璃刻蚀速率为106.8nm/min,表面粗糙度为...

    pxcap - Python libpcap wrapper in Pyrex-开源

    pxcap是基于Python的一个库,它使用了Pyrex技术来封装libpcap库,从而为Python程序员提供了一种...通过学习和使用pxcap,Python开发者能够深入洞察网络流量,从而解决各种问题,从性能优化到安全监控,都有其应用场景。

    Pex-开源

    Pex是一款开源工具,专为Pyrex或Cython设计,旨在增强Python代码在处理数字运算时的性能。它引入了一种方式,允许开发者利用numpy.ndarray库来编写C级别的快速数字处理代码,显著提升了执行效率。Pex的核心理念是...

    基于Python和Java的HanLP自然语言处理设计源码

    该项目是一款综合性的自然语言处理设计源码,基于Python和Java语言开发,包含590个文件,其中Python文件421个,Markdown文件146个,ReStructuredText文件8个,Java文件6个,YAML文件2个,Pyrex文件2个,Git忽略文件1...

    使用Sage进行数值计算(润色版本一)1

    Chapter 10: 使用 Sage 进行数值计算 在 Sage 中进行数值计算涉及多个库和工具,这些工具为用户提供了广泛的数值处理能力。...对于已经熟悉 Python 和 Sage 的用户,这将是深入学习数值计算的宝贵资源。

    python-spidermonkey

    安装pyrex:sudo apt-get install python-pyrex 安装g++:sudo apt-get install g++ 安装libjs.so: $ tar zxvf js-1.7.0.tar.gz $ cd js/src $ make -f Makefile.ref $ cp Linux_All_DBG.OBJ/libjs.so /...

    使用最广泛的Python到C编译器-Python开发

    Cython基于Pyrex,但支持更多的尖端功能和优化。 Cython语言非常c欢迎使用Cython! Cython是一种使Python编写C扩展与Python本身一样容易的语言。 Cython基于Pyrex,但支持更多的尖端功能和优化。 Cython语言与Python...

    EPA-3540C 英文.pdf

    - 内径为 20 毫米的 Pyrex® 色谱柱,在底部装有 Pyrex® 玻璃棉。 - 注意:带有过滤盘的玻璃柱难以在处理高度污染的提取液后保持清洁;建议使用没有过滤盘的柱子,并使用一小块 Pyrex® 玻璃棉来固定吸附剂。在填充...

    用于评估钢琴练习表现的 Python工具_python_代码_下载

    记录器目录有一个围绕 OS X 的核心 MIDI 库的 pyrex 包装器和 用于输出来自 MIDI 键盘的事件的 Python 脚本。 示例目录有一些初始记录和“分数” Hanon 的第 21 个练习的右手(以及用于生成的 Python 代码) 这个...

    python优化算法工具包-整理一份可以让Python变得更快的工具清单,排序算法数据结构 最快的排序算法

    Pyrex、Cython、Numba和Shedskin是四个可以帮助开发者将Python代码翻译为C、C++和LLVM的代码的工具。这些工具可以帮助开发者实现快速的代码执行,提高代码的执行速度。 9. SWIG、F2PY和Boost.Python SWIG、F2PY和...

    python-cython:https

    Cython基于Pyrex,但支持更多的尖端功能和优化。 Cython语言与Python语言非常接近,但是Cython还支持调用C函数以及在变量和类属性上声明C类型。 这使编译器可以从Cython代码生成非常有效的C代码。 这使Cython成为...

    Expert Python Programming(PACKT,2ed,2016)

    Moving on, you will learn to effectively create Python extensions with C, C++, cython, and pyrex. The important factors while writing code such as code management tools, writing clear documentation, ...

    pappy-开源

    2. **Pyrex**:Pyrex是一种混合Python和C的编程语言,用于编写高效的Python扩展模块。它可以将Python代码直接转换为C,然后编译成C扩展,提高了运行效率,尤其适用于处理大量计算或底层操作的场景。 3. **Pythonic...

    pysclint-开源

    通过使用SWIG(Simplified Wrapper and Interface Generator)或PyRex,pysclint能够创建高效、易用的Python绑定,使得开发者在Python环境中可以充分利用这些强大的数据处理和并行计算工具。 HDF是一种标准的数据...

Global site tag (gtag.js) - Google Analytics