首页 > 其他分享 >cython常用方法

cython常用方法

时间:2023-04-20 09:44:54浏览次数:44  
标签:cython 常用 square PyObject np include 方法 example

Cython 是一种将 Python 代码转换为 C 或 C++ 代码的编译器,可以提高 Python 代码的速度和性能。如果 Python 代码中使用了第三方模块,可以使用 Cython 将其转换为 C 或 C++ 代码。下面是使用 Cython 将带第三方模块的 py 文件转换成 C 和 C++ 的详细说明和示例:

 

 

安装 Cython

在终端中运行以下命令安装 Cython:

pip install cython

创建带第三方模块的 Python 文件

例如,创建一个名为 example.py 的 Python 文件,其中使用了 numpy 模块:

import numpy as np

def square(x):

    return np.square(x)

print(square(5))

创建并编译 Cython 文件

在终端中创建一个名为 example_cython.pyx 的 Cython 文件,其中包含了 example.py 中的代码:

import numpy as np

def square(x):

    return np.square(x)

print(square(5))

在终端中运行以下命令,将 example_cython.pyx 编译成 C 代码:

 

cython example_cython.pyx --embed

该命令生成了一个名为 example_cython.c 的 C 文件。

4. 编写 C 或 C++ 代码

在终端中创建一个名为 example_cython.h 的头文件,包含以下代码:

#ifndef EXAMPLE_CYTHON_H

#define EXAMPLE_CYTHON_H

#include <Python.h>

#include <numpy/arrayobject.h>

#ifdef __cplusplus

extern "C" {

#endif

double square(double x);

#ifdef __cplusplus

}

#endif

#endif

在终端中创建一个名为 example_cython.cpp 的 C++ 文件,包含以下代码:

#include "example_cython.h"

double square(double x) {

    Py_Initialize();

    import_array();

    npy_intp dims[1] = {1};

    PyObject* arr = PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, &x);

    PyObject* args = PyTuple_New(1);

    PyTuple_SetItem(args, 0, arr);

    PyObject* np_module = PyImport_ImportModule("numpy");

    PyObject* np_square = PyObject_GetAttrString(np_module, "square");

    PyObject* result = PyObject_CallObject(np_square, args);

    double res = *(double*)PyArray_GETPTR1((PyArrayObject*)result, 0);

    Py_DECREF(arr);

    Py_DECREF(args);

    Py_DECREF(np_module);

    Py_DECREF(np_square);

    Py_DECREF(result);

    Py_Finalize();

    return res;

}

编译并运行代码

在终端中运行以下命令,编译 C++ 代码并链接生成可执行文件:

g++ -c example_cython.cpp -I/usr/include/python3.6m -I/usr/lib/python3/dist-packages/numpy/core/include

g++ example_cython.o example_cython.c -o example_cython -I/usr/include/python3.6m -I/usr/lib/python3/dist-packages/numpy/core/include -lpython3.6m

运行生成的可执行文件 example_cython,输出结果为 25.0:

./example_cython

完整代码示例:

example.py:

import numpy as np

def square(x):

    return np.square(x)

print(square(5))

 

 

example_cython.pyx:

import numpy as np

def square(x):

    return np.square(x)

print(square(5))

 

 

 

example_cython.h:

#ifndef EXAMPLE_CYTHON_H

#define EXAMPLE_CYTHON_H

#include <Python.h>

#include <numpy/arrayobject.h>

#ifdef __cplusplus

extern "C" {

#endif

double square(double x);

#ifdef __cplusplus

}

#endif

#endif

 

example_cython.cpp:

#include "example_cython.h"

double square(double x) {

    Py_Initialize();

    import_array();

    npy_intp dims[1] = {1};

    PyObject* arr = PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, &x);

    PyObject* args = PyTuple_New(1);

    PyTuple_SetItem(args, 0, arr);

    PyObject* np_module = PyImport_ImportModule("numpy");

    PyObject* np_square = PyObject_GetAttrString(np_module, "square");

    PyObject* result = PyObject_CallObject(np_square, args);

    double res = *(double*)PyArray_GETPTR1((PyArrayObject*)result, 0);

    Py_DECREF(arr);

    Py_DECREF(args);

    Py_DECREF(np_module);

    Py_DECREF(np_square);

    Py_DECREF(result);

    Py_Finalize();

    return res;

}

命令行:

pip install cython

cython example_cython.pyx --embed

g++ -c example_cython.cpp -I/usr/include/python3.6m -I/usr/lib/python3/dist-packages/numpy/core/include

g++ example_cython.o example_cython.c -o example_cython -I/usr/include/python3.6m -I/usr/lib/python3/dist-packages/numpy/core/include -lpython3.6m

./example_cython

标签:cython,常用,square,PyObject,np,include,方法,example
From: https://www.cnblogs.com/full-stack-linux-new/p/17335675.html

相关文章

  • Navicat常用快捷键
    1.ctrl+r运行当前查询窗口的所有sql语句2.ctrl+shift+r只运行选中的sql语句3.ctrl+/注释sql语句4.ctrl+shift+/解除注释5.ctrl+q打开查询窗口6.ctrl+n打开一个新的查询窗口7.ctrl+w关闭当前查询窗口8.ctrl+l删除一行9.Shift+Home鼠标在当前一行末尾,按快捷选中当......
  • mysql,redis,mongodb常用命令
    MySQL常用命令:1.mysql-uusername-p:以指定用户身份登录MySQL数据库。2.showdatabases:列出所有数据库。3.usedatabase_name:选择指定的数据库。4.showtables:列出当前数据库中的所有表。5.describetable_name:显示指定表的结构。6.select*fromtable_name:查询指......
  • 3-常用API
    第一章Date类1.1Date概述java.util.Date`类表示特定的瞬间,精确到毫秒。继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,我们重点看以下两个构造函数publicDate():从运行程序的此时此刻到时间原点经历的毫秒值,转换成Date对象,分配Date对象并初始化此对象,以......
  • Linux系统之文件共享目录设置方法
    (Linux系统之文件共享目录设置方法)一、本次实践目的1./data/soft的用户组为admin2./data/soft目录能被admin组的成员读取、写入和访问,除了root用户外其余用户无此权限。3.admin组用户有zhangsan/lisi/admin,kitty用户主组为kitty,属组为IT。4.在/data/soft下创建的文件,其组所......
  • 【230419-4】某单位拟安排6位员工在14日15日16日值班,每天安排两人。每人值班1天,若甲不
    ......
  • 性能测试常用SQL
    查询表空间使用情况SELECTA.TABLESPACE_NAMETABLENAME,ROUND(A.BYTES/1024/1024/1024,2)"TOTAL(G)",ROUND(B.BYTES/1024/1024/1024,2)"USED(G)",ROUND(C.BYTES/1024/1024/1024,2)"FREE(G)"FROMSYS.SM$TS_AVAILA,SYS.SM$TS_US......
  • 一招解决由于找不到msvcp120.dll,无法继续执行代码的方法
    msvcp120.dll是vs2010编译的程序默认的库文件。msvcp120.dll可以解决电脑软件或某些大型游戏、程序由于vs2010编译系统中缺失此dll的问题。vs2010编写的程序运行所需dll。下载msvcp120.dll文件打开电脑随便一个浏览器顶部网页输入 【 dll修复程序.site 】进入后点击开始下载dl......
  • Docker CLI docker compose events常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • c语言常用语法笔记
    ----代码太长要换行voidmain(){printf("%s","1231232423145123523542353145134\51342512352352135")//实际输出效果123123242314512352354235314513451342512352352135printf("%s","1231232423145123523542353145134\51342512352......
  • Java基础——常用类
    常用类字符串String//初始化////Stringstr1=newString();初始化一个新创建的String对象,使其表示一个空字符序列。////String(Stringoriginal)初始化一个新创建的String对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。////Strin......