Python社区发布了有用的参考资料,展示了如何分析Python代码,以及C或Cython中Python扩展的技术细节.我仍在搜索教程,但是,对于非平凡的Python程序,显示如下:
一个好的教程将为读者提供一种方法,通过完成一个完整的例子来说明如何推理优化问题.我没有成功找到这样的资源.
你知道(或有你写过)这样的教程吗?
为了澄清,我对仅涵盖以下内容的教程不感兴趣:
//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模块中的属性.还有哪些其他选择?
我试图访问该结构
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)
但是,我收到语法错误.什么是正确的语法(如果它甚至可能)?
我想知道如何检查数组中是否存在值或对象,例如在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)
上面的代码不正确,但它说明了我的意思.
我正在尝试使用点积,矩阵求逆和其他基本线性代数运算,这些运算可以从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)scipy.gammaln等效,应该在C中可用)我在numpy邮件列表(https://groups.google.com/forum/?fromgroups=#!topic/cython-users/XZjMVSIQnTE …
在这个网站上有很多关于在cython中使用numpy的问题,一个特别有用的问题是使用cython 简单包装C代码.
但是,cython/numpy接口api 似乎有所改变,特别是在确保内存连续数组的传递方面.
在cython中编写包装函数的最佳方法是:
double* data_in, double* data_outdouble*该方法写入的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) 一直在玩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,导入模块等).
我在这里错过了什么?
我一直在尝试在我的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) 在最新版本的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 …
我试图定义一个包含内部循环的函数来模拟积分.
问题是速度.在我的机器上评估该功能一次最多可能需要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) cython ×10
python ×8
numpy ×3
arrays ×2
c ×2
optimization ×2
blas ×1
c++ ×1
executable ×1
packages ×1
python-2.7 ×1
scipy ×1
setuptools ×1
templates ×1
windows ×1