我的问题:我发现使用STL映射和向量处理大型数据集与原始C ++通常可以比使用Cython快得多(并且内存占用更less)。 我认为这部分的速度损失是由于使用了Python列表和字典,并且在Cython中可能会有一些技巧使用较less的devise数据结构。 例如,这个页面( http://wiki.cython.org/tutorials/numpy )展示了如何通过预定义ND数组的大小和types来在Cython中快速生成numpy数组。 问题:有没有办法像列表/字典那样做类似的事情,例如大致说明你期望在其中有多less个元素或(键,值)对? 也就是说,有没有一种习惯的方法来将列表/字典转换为Cython中的(快速)数据结构? 如果没有,我想我只需要用C ++编写它,并包装在一个Cython导入。
在Cython中使用复数的正确方法是什么? 我想写一个纯粹的C循环使用dtype np.complex128的numpy.ndarray。 在Cython中,关联的Ctypes是在Cython/Includes/numpy/__init__.pxd as ctypedef double complex complex128_t 所以这似乎只是一个简单的C双复杂。 但是,很容易获得奇怪的行为。 特别是有了这些定义 cimport numpy as np import numpy as np np.import_array() cdef extern from "complex.h": pass cdef: np.complex128_t varc128 = 1j np.float64_t varf64 = 1. double complex vardc = 1j double vard = 1. 线 varc128 = varc128 * varf64 可以由Cython编译,但是gcc不能编译生成的C代码(错误是“testcplx.c:663:25:error:两个或多个数据types在声明说明符中”,似乎是由于typedef npy_float64 _Complex __pyx_t_npy_float64_complex; )。 […]
我想用C或C ++编写一些模块,使用BLAS和LAPACK扩展python和numpy。 我也希望能够将代码作为独立的C / C ++库进行分发。 我想这个库使用单精度浮点数和双精度浮点数。 我将写的函数的一些例子是求解线性系统或加速一阶方法的共轭梯度。 一些函数需要从C / C ++代码调用Python函数。 在用Python / C API和Numpy / C API玩了一下之后,我发现很多人主张使用Cython(参见例如这个问题或这个 问题 )。 我不是Cython的专家,但似乎在某些情况下 ,您仍然需要使用Numpy / C API并知道它是如何工作的。 鉴于我已经有了一些关于Python / C API的知识,而且还没有关于Cython的知识,所以我想知道继续使用Python / C API是否合理,如果使用这个API比Cython有一些优势。 未来,我肯定会开发一些不涉及数值计算的东西,所以这个问题不仅仅是关于数值计算的问题。 我喜欢关于Python / C API的事情之一是我学习了一些关于Python解释器是如何工作的。 谢谢。
在我的安装中,numpy的arrayobject.h位于…/site-packages/numpy/core/include/numpy/arrayobject.h 。 我写了一个简单的使用numpy的Cython脚本: cimport numpy as np def say_hello_to(name): print("Hello %s!" % name) 我也有以下distutils setup.py (从Cython用户指南复制): from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [Extension("hello", ["hello.pyx"])] setup( name = 'Hello world app', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules ) 当我尝试使用python setup.py build_ext –inplace构build时,Cython尝试执行以下操作: gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd […]
我目前使用Cython来链接C和Python,并获得python代码的慢速加速。 然而,我想使用goroutines来实现一个非常慢(并且非常可并行化)的代码位,但它必须从python调用。 (我已经看到了这个问题 ) 我(有点儿)很高兴通过C(或Cython)来设置数据结构等,如果有必要的话,但是从错误修复/回避的angular度来看,避免这个额外的层是很好的。 什么是最简单的方法来做到这一点,而不必重新发明任何车轮?
我有一些C函数,我想从Python中调用它们。 cython似乎是要走的路,但我不能真正find一个这样做的例子。 我的C函数看起来像这样: void calculate_daily ( char *db_name, int grid_id, int year, double *dtmp, double *dtmn, double *dtmx, double *dprec, double *ddtr, double *dayl, double *dpet, double *dpar ) ; 我只想指定前三个参数(一个string和两个整数),然后恢复8个numpy数组(或python列表,所有双数组都有N个元素)。 我的代码假定指针指向已经分配的内存块。 另外,生成的C代码应该链接到一些外部库。
我想用Cython包装一个包含C ++和OpenMP代码的testing项目,并通过setup.py文件使用distutils构build它。 我的文件的内容如下所示: from distutils.core import setup from distutils.extension import Extension from Cython.Build import cythonize from Cython.Distutils import build_ext modules = [Extension("Interface", ["Interface.pyx", "Parallel.cpp"], language = "c++", extra_compile_args=["-fopenmp"], extra_link_args=["-fopenmp"])] for e in modules: e.cython_directives = {"embedsignature" : True} setup(name="Interface", cmdclass={"build_ext": build_ext}, ext_modules=modules) -fopenmp标志与gcc一起使用来编译和链接到OpenMP。 但是,如果我只是援引 cls ~/workspace/CythonOpenMP/src $ python3 setup.py build 这个标志不被识别,因为编译器是叮当声的: running build running build_ext […]
我试图find一种有效的方法将包含整数点的数据行组合在一起,并将它们存储为Python对象。 数据由X和Y坐标点组成,用逗号分隔的string表示。 如(x_1, y_1), (x_2, y_2), …等等必须配对,然后存储为一个对象列表,其中每个点是一个对象。 下面的函数get_data生成这个示例数据: def get_data(N=100000, M=10): import random data = [] for n in range(N): pair = [[str(random.randint(1, 10)) for x in range(M)], [str(random.randint(1, 10)) for x in range(M)]] row = [",".join(pair[0]), ",".join(pair[1])] data.append(row) return data 我现在的parsing代码是: class Point: def __init__(self, a, b): self.a = a self.b = b def […]
我发现我的Python代码中的瓶颈,与心理等玩过。然后决定编写ac / c + +扩展的性能。 在swig的帮助下,你几乎不需要关心参数等。一切正常。 现在我的问题:在调用实际的.pyd或.so代码之前,swig会创build一个相当大的py文件,它会执行大量的“检查”和“PySwigObject”。 如果你手写这个文件,或者让swig去做,你们中的任何人是否有任何经验是否有更多的性能获得?
我正在编写一个包含Cython扩展的Python模块,并使用LAPACK (和BLAS )。 我愿意使用clapack或lapacke ,或者某种f2py或f2py解决scheme。 重要的是,我可以在没有Python调用开销的情况下,在紧密的循环中调用lapack和blas例程。 我在这里find一个例子。 但是,这个例子取决于SAGE。 我希望我的模块可以在不安装SAGE的情况下进行安装,因为我的用户不太可能想要或者不需要SAGE。 我的用户可能会安装像numpy,scipy,pandas和scikit这样的软件包,所以这些都是合理的依赖关系。 什么是使用接口的最佳组合,最小的setup.py文件是什么样的,可以从编译中获取必要的信息(从numpy,scipy等)? 编辑:这是我最终做的。 它适用于我的MacBook,但我不知道它是多么便携。 当然有更好的方法。 from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext import numpy from Cython.Build import cythonize from numpy.distutils.system_info import get_info # TODO: This cannot be the right way blas_include = get_info('blas_opt')['extra_compile_args'][1][2:] includes = [blas_include,numpy.get_include()] setup( cmdclass = {'build_ext': build_ext}, […]