标签: cython

有关使用C扩展或Cython优化非平凡Python应用程序的教程

Python社区发布了有用的参考资料,展示了如何分析Python代码,以及C或Cython中Python扩展的技术细节.我仍在搜索教程,但是,对于非平凡的Python程序,显示如下:

  1. 如何通过转换为C扩展来识别将从优化中受益的热点
  2. 同样重要的是,如何识别不会从转换为C扩展中受益的热点
  3. 最后,如何使用Python C-API或(甚至可能更好)使用Cython进行从Python到C的适当转换.

一个好的教程将为读者提供一种方法,通过完成一个完整的例子来说明如何推理优化问题.我没有成功找到这样的资源.

你知道(或有你写过)这样的教程吗?

为了澄清,我对涵盖以下内容的教程不感兴趣:

  • 使用(c)Profile来分析Python代码以测量运行时间
  • 使用工具检查配置文件(我推荐RunSnakeRun)
  • 通过选择更合适的算法或Python构造进行优化(例如,用于成员资格测试而不是列表的集合); 本教程应该假设算法和Python代码已经是最优的,并且我们处于C扩展是下一个逻辑步骤的位置
  • 重新编写关于编写C扩展Python文档,这已经很好地作为参考,但作为显示何时以及如何从Python移动到C的资源无用.

c python optimization cython python-extensions

25
推荐指数
2
解决办法
1852
查看次数

如何在Cython模块中将#defined C值暴露给Python?

我想在这里定义整数常量(ACTIVE_TAG等):

//island management, m_activationState1
#define ACTIVE_TAG 1
#define ISLAND_SLEEPING 2
#define WANTS_DEACTIVATION 3
#define DISABLE_DEACTIVATION 4
#define DISABLE_SIMULATION 5
Run Code Online (Sandbox Code Playgroud)

可用作我正在处理的Cython定义模块的普通属性,以便Python应用程序代码可以访问它们(将它们传递给根据它们定义的包装API).

我已经看过用cdef定义这些作为整数或枚举,但这些方法实际上都没有将值绑定到Cython模块中的属性.还有哪些其他选择?

python cython

25
推荐指数
2
解决办法
6799
查看次数

使用cython包装c ++ struct模板

我试图访问该结构

template <int dim>
struct Data { 
  double X[dim];
  double Val[dim];
}; 
Run Code Online (Sandbox Code Playgroud)

在cython中.我猜测正确的语法应该是这样的:

cdef extern from "Lib.h" namespace "LIB":
    cdef struct Data[int dim]:
      double X[dim];
      double Val[dim];
Run Code Online (Sandbox Code Playgroud)

但是,我收到语法错误.什么是正确的语法(如果它甚至可能)?

c++ templates cython

25
推荐指数
1
解决办法
2367
查看次数

检查Cython中的数组中是否存在值

我想知道如何检查数组中是否存在值或对象,例如在python中:

a = [1,2,3,4,5]
b = 4
if b in a:
    print("True!")
else:
    print("False")
Run Code Online (Sandbox Code Playgroud)

我想知道cython中是否存在类似的东西.我有一个struct对象数组指针; 我想知道该数组中是否存在该对象.

喜欢

cdef Node *array

array = <Node *>malloc( 5 * cython.sizeof(Node))

for i in range(5):
     array[i].index = i

cdef Node test = array[3]

if test in array:
    print("True!")

cdef struct Node:
    int index
Run Code Online (Sandbox Code Playgroud)

上面的代码不正确,但它说明了我的意思.

c arrays cython

25
推荐指数
1
解决办法
10万
查看次数

在Cython中调用点积和线性代数运算?

我正在尝试使用点积,矩阵求逆和其他基本线性代数运算,这些运算可以从Cython中获得.函数如numpy.linalg.inv(反转),numpy.dot(点积),X.t(矩阵/数组的转置).numpy.*从Cython函数调用有很大的开销,其余的函数是用Cython编写的,所以我想避免这种情况.

如果我假设用户已numpy安装,有没有办法做类似的事情:

#include "numpy/npy_math.h"
Run Code Online (Sandbox Code Playgroud)

作为一个extern,并调用这些功能?或者直接调用BLAS(或者numpy调用这些核心操作的任何东西)?

举一个例子,想象一下你在Cython中有一个函数做很多事情,最后需要进行涉及点积和矩阵求逆的计算:

cdef myfunc(...):
  # ... do many things faster than Python could
  # ...
  # compute one value using dot products and inv
  # without using 
  #   import numpy as np 
  #   np.*
  val = gammaln(sum(v)) - sum(gammaln(v)) + dot((v - 1).T, log(x).T)
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?如果有一个库已经在Cython中实现了这些,我也可以使用它,但没有找到任何东西.即使这些程序没有直接优化BLAS,没有numpy从Cython 调用Python模块的开销仍然会使整体事情变得更快.

我要调用的示例函数:

  • 点积(np.dot)
  • 矩阵求逆(np.linalg.inv)
  • 矩阵乘法
  • 转置(相当于x.Tnumpy)
  • gammaln函数(类似于scipy.gammaln等效,应该在C中可用)

我在numpy邮件列表(https://groups.google.com/forum/?fromgroups=#!topic/cython-users/XZjMVSIQnTE …

python numpy cython blas scipy

25
推荐指数
1
解决办法
6056
查看次数

通过Cython将numpy数组传递给C++方法并返回

在这个网站上有很多关于在cython中使用numpy的问题,一个特别有用的问题是使用cython 简单包装C代码.

但是,cython/numpy接口api 似乎有所改变,特别是在确保内存连续数组的传递方面.

在cython中编写包装函数的最佳方法是:

  • 采用一个可能但不一定是连续的numpy数组
  • 使用签名调用C++类方法 double* data_in, double* data_out
  • 返回double*该方法写入的numpy数组?

我的尝试如下:

cimport numpy as np
import numpy as np # as suggested by jorgeca

cdef extern from "myclass.h":
    cdef cppclass MyClass:
        MyClass() except +
        void run(double* X, int N, int D, double* Y)

def run(np.ndarray[np.double_t, ndim=2] X):
    cdef int N, D
    N = X.shape[0]
    D = X.shape[1]

    cdef np.ndarray[np.double_t, ndim=1, mode="c"] X_c
    X_c = np.ascontiguousarray(X, dtype=np.double)

    cdef np.ndarray[np.double_t, ndim=1, mode="c"] Y_c
    Y_c = np.ascontiguousarray(np.zeros((N*D,)), …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy cython

25
推荐指数
1
解决办法
1万
查看次数

在Cython中创建可执行文件

一直在玩cython.通常用Python编程,但在前一生中使用过C. 我无法弄清楚如何制作一个独立的可执行文件.

我已经下载了cython,我可以创建一个.pyx文件(这只是一个扩展名为.pyx的普通Python文件),它在Python shell中执行,使用:import pyximport; pyximport.install()

我可以在命令行生成一个.c文件:cython file.pyx我可以通过构建标准的setup.py来生成一个.so文件并执行:

setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

我尝试使用带有各种选项的gcc从.so文件中创建一个可执行文件,但总是有大量丢失的文件,标题等.尝试过从几乎所有地方指向标题,但没有成功,并且我并不熟悉所有gcc选项的功能,或者即使我应该使用gcc.

我在这里断开了事实,我可以在Python shell中运行我的程序,但不是在命令行,(我不希望用户必须进入shell,导入模块等).

我在这里错过了什么?

python executable packages cython

25
推荐指数
3
解决办法
2万
查看次数

在Windows x64中运行Cython - 致命错误C1083:无法打开包含文件:'basetsd.h':没有这样的文件或目录

我一直在尝试在我的Window 7系统上安装Cython for Python 2.7.特别是,我更喜欢64位的所有内容.(如果你想知道,我需要Cython,因为Cython是我需要另一个软件包进行专门的数值分析所需的组件之一.而x64可能是存储大型数据集的一个优势.)

所以我从官方网站下载了x64 Python 2.7.来自Christoph Gohlke的Cython.当然,Python 2.7的amd64版本.在我安装之前,我将Python 2.7添加到注册表中,其中.reg包含Joe DF的答案中的文件.之后,我从这里安装了Visual C++编译器(我认为它不起作用)和这里(但是应该这样).在这一点上,我有我的C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin目录中所有的vcvars32.bat,vcvars64.bat,vcvars86_amd64.bat,vcvarsx86_ia64.bat.我跑了vcvars64.bat,没有错误信息.

随后,我按照此页面创建了一个"hello world"测试文件.

然后,我收到了这个错误.

...\Tests>python setup.py build_ext --inplace
running build_ext
building 'hello' extension
error: Unable to find vcvarsall.bat
Run Code Online (Sandbox Code Playgroud)

所以我心想:嗯,Cython找不到那个文件,因为它不存在.(我搜索我的整个它的硬盘.)所以我复制vcvars64.bat...\VC\bin\VC,改变了名称vcvarsall.bat.现在vcvarsall错误消失了.而且......自然会出现一个新的错误.

...\Tests>python setup.py build_ext --inplace
running build_ext
building 'hello' extension
C:\Program Files (x86)\Microsoft …
Run Code Online (Sandbox Code Playgroud)

python windows cython python-2.7 python-extensions

25
推荐指数
3
解决办法
4万
查看次数

当需要编译 Cython 时,python setup.py install 的最佳替代品是什么?

在最新版本的setuptools中,该python setup.py install命令已被弃用(有关更多信息,请参阅https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html )。

(venv) [jon@dev02 py38]$ python setup.py install
running install
/home/jon/.jenkins/workspace/Farm_revision_linux_py36/TOXENV/py38/venv/lib64/python3.8/site-
packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is 
deprecated. Use build and pip and other standards-based tools.
  warnings.warn(
/home/jon/.jenkins/workspace/Farm_revision_linux_py36/TOXENV/py38/venv/lib64/python3.8/site-
packages/setuptools/command/easy_install.py:156: EasyInstallDeprecationWarning: easy_install 
command is deprecated. Use build and pip and other standards-based tools.
  warnings.warn(
running bdist_egg
running egg_info
... etc
Run Code Online (Sandbox Code Playgroud)

建议您只pip install .从源代码安装包,但这不会编译任何 Cython 代码。执行此操作的最佳方法是什么?

Cython文档仍然建议使用setup.py,但我找不到任何更好的建议。看来开发人员安装(pip install -e .)确实编译了 Cython 文件,或者您可以python setup.py build_ext --inplace在运行后进行编译pip install …

python setuptools cython

25
推荐指数
1
解决办法
2万
查看次数

Cython没有速度提升

我试图定义一个包含内部循环的函数来模拟积分.

问题是速度.在我的机器上评估该功能一次最多可能需要30秒.由于我的最终目标是最小化这个功能,一些额外的速度会很好.

因此,我试图让Cython工作,但我必须犯一个严重的错误(可能很多人!).在Cython文档之后,我尝试输入我的变量.这样做之后,代码就像纯Python一样慢.这看起来很奇怪.

这是我的代码:

import numpy as np 
cimport cython
cimport numpy as np
import minuit

data = np.genfromtxt('q6data.csv', usecols = np.arange(1, 24, 1), delimiter = ',')  

cdef int ns    = 1000                 # Number of simulation draws
cdef int K     = 5                    # Number of observed characteristics, including            constant
cdef int J     = len(data[:,1])       # Number of products, including outside
cdef double tol   = 0.0001            # Inner GMM loop tolerance
nu = np.random.normal(0, 1, (6, ns))  # ns random deviates …
Run Code Online (Sandbox Code Playgroud)

python optimization numpy cython

24
推荐指数
5
解决办法
8220
查看次数