问题标签 [cythonize]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1175 浏览

python - 在 C++ (Cython) 中运行带有参数的已编译 python 脚本

我试图实现的是将我的 Python 脚本编译为 lib/dll 并使用 arguments 调用它

这是脚本的setup.py文件:

使用此命令生成编译输出:

产生以下文件:

和一个名为 build 的子目录,其中包含:

如何从带有参数的 c++ 代码调用已编译的脚本?

我使用 Cython 来完成这项任务,但这不是强制性的,也可以使用 boost 或其他方法(我这样做是为了使源代码无法访问)。

编辑:

使用 Mykola Shchetinin 提供的文档,我设法为我的脚本生成了一个 API 头文件。我基本上在我的主函数中添加了一个 cdef api 关键字。虽然这确实有助于我将方法名称导出到 c++,但我仍然需要一种方法来将一些参数传递给我的脚本。因为我传递字符串参数,所以我希望有一种类似的方式,比如使用 PyRun 设置 argv 并解析脚本中的参数(因为如果可能的话,我想避免将字符串从 c 转换为 python 编码)有什么简单的方法可以传递那些字符串参数?

编辑2:

我让它工作了!按照 Mykola 提供的示例并直接编译 c 文件输出而不是使用 .lib 我得到了它的工作。

0 投票
1 回答
543 浏览

python - 有什么方法可以设置用ucs2编译的cython?

Cython 将 python 代码转换为共享对象时遇到问题。

设置文件在这里:

因此,在我转移到 CentOS 的 Ubuntu 桌面实用程序上一切正常。

得到错误:

未定义符号:PyUnicodeUCS4_DecodeUTF8

我用谷歌搜索,发现有很多问题,但是,几乎所有人都说根本原因是带有 UCS2 或 UCS4 的 python,我理解这一点,没有找到解决这个问题的方法。

IMO,解决方法:

  1. 通过“--enable-unicode=ucs4/ucs2”重建python以获得正确的版本

但我需要重新安装所有软件包

  1. 从另一个具有正确 UCS 的 python 的桌面编译代码

现在,我想是否有办法将 Cython 设置为使用指定的 UCS 模式进行编译。

任何建议都非常感谢。

谢谢。

0 投票
1 回答
2528 浏览

multithreading - 使用 Cython 启用并行性

我正在尝试使prangeCythonparallel包的功能正常工作,似乎没有并行性。为了拥有 MWE,我从Cython: A Guide for Python Programmers一书中获取了示例代码,并通过添加一些打印语句对其进行了一些修改。示例代码可在github上免费获得,我所指的代码位于:examples/12-parallel-cython/02-prange-parallel-loops/。

以下是我对 julia.pyx 文件的修改。

当我使用setup_julia.py给出的编译时

用命令

python setup_julia.py build_ext --inplace

并运行 run_julia.py 文件,我看到 for 循环的所有实例只使用一个线程 -- Thread 0。终端输出如下所示。

据我了解, for 循环只是并行运行。有人可以指导我如何启动 for 循环以在多个线程之间分配负载吗?我还尝试将系统变量设置为OMP_NUM_THREADS大于 1 的某个数字,但没有任何效果。

我正在使用 Python 2.7.10 和 gcc 5.2.0 在 OSX 10.11.6 上运行测试。

0 投票
1 回答
208 浏览

python - 从 Cython 的列表中调用方法

我想在 Cython 的 prange 循环中并行执行 3 个采用相同输入的函数。他们在相同的变量TV和上添加值,并du采用相同的变量。代码的目的是计算四个主要方向上的像素梯度,然后按像素计算总变化。

为此,我创建了一个包含方法名称的列表并遍历该列表。我有这个代码:

虽然它在纯 Python 中工作,但 Cython 在编译时失败:

有什么意思吗?


编辑:

这个概念证明有效:

0 投票
1 回答
270 浏览

python - 将 dask 与 cythonized 类一起使用。对象方法的酸洗错误

我想用以下类对python模块进行cythonize:

安装 cythonized 模块后,我正在尝试执行代码:

我有酸洗错误(静态和非静态方法相同):

为什么会这样?

0 投票
0 回答
273 浏览

python - Python DLL 与 C++ DLL

我已经阅读了网络上的各种文章,以对 DLL 有一些基本的了解。

据我了解,DLL 是二进制文件,因此如果我能够使用Cython.build包从 Python 脚本生成 DLL,那么与原始 Python 脚本相比,DLL 将加快速度。

如果没有 C++ 代码优化,使用的 DLL 是否会Cython.build提供与具有相同逻辑的本地 C++ 代码相同的速度。

还是我以上的理解都是错误的?

0 投票
1 回答
425 浏览

python - 代码的 Cython 优化

我正在努力使用 Cython 提高我的 python 粒子跟踪代码的性能。

这是我的纯 Python 代码:

显然,最耗时的过程是积分 ODE,在 Integrator 类中定义为 odeSolve() 和 equations()。此外,在求解过程中,类 Ring 中的 getEMField() 方法与 equations() 方法一样多。我尝试使用 Cython 获得显着的加速(至少 10 倍~20 倍),但通过以下 Cython 脚本我只获得了约 1.5 倍的加速水平:

我应该怎么做才能从 Cython 中获得最大的效果?(我尝试了 Numba 而不是 Cython,实际上 Numba 的性能提升是巨大的(大约 20 倍加速)。但是我很难将 Numba 与 python 类实例一起使用,因此我决定使用 Cython 而不是 Numba)。

作为参考,以下是 cython 对其编译的注解: 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

0 投票
0 回答
463 浏览

python-3.x - 对于 python 3,使用 bisect 构建 Cython 失败

我正在尝试构建一个使用该模块的cythonbisect模块。使用 python-2 编译时,导入工作完美无缺,但为 python-3 编译时,我得到一个奇怪的递归错误。这是一个示例测试和设置脚本:

设置脚本

构建说明

我用 conda 创建了一个新的 python3 环境,安装的包列表是:

0 投票
1 回答
1988 浏览

python-3.x - 如何在 Windows 8.1 中的 anaconda(python3.6) 中将 cython pyx 构建为 pyd?

我已经推荐了一些网站在 Windows 8.1 中构建 pyx 到 pyd。我正在使用带有 Spyder IDE 的 Anaconda Distribution,我已经开发了 pyx 文件并且无法在“Anaconda 命令提示符”中构建 Anaconda>

并尝试过

收到以下错误:

我简单的 pyx 代码是

和我的 setup.py 文件如下..

如何在 Windows 8.1 中摆脱这个问题?我想使用 Struct 和 Socket 库进行套接字编程。

0 投票
0 回答
380 浏览

python - Cythonizing 用 Python 编写的类的特定方法

我有一个纯粹用 Python 编写的 A* 规划算法(使用这个关于路径规划的优秀资源)。具有相关移动和成本方法的网格类定义如下:

现在,我想使用 Cython 的静态编译器优势来加快执行速度。一种选择是用 Cython 中的静态类型重写整个事情。我使用 cProfiler 分析了纯 Python 代码以查看瓶颈所在,不出所料,大约 70% 的总执行时间进入了该neighbors方法(计算当前节点周围的有效相邻节点)。更具体地说,对于给定的玩具示例,列表理解行neighbors调用passable了超过 33,000 次。passable通过搜索SquareGrid障碍物的知识来检查其参数中给出的节点是否被标记为“障碍物”(SquareGrid.walls,位置元组列表)并相应地返回一个布尔值。在我看来,只要优化这个特定的方法,我就会在速度上获得显着的提升。所以我开始passable用 Cython 重写。

总的来说,我是 Cython 和 C/C++ 的完全新手,所以如果在理解这件事的实际工作原理方面有任何错误被指出,我将不胜感激。我创建了一个 pyrex 文件passable_cy.pyx,希望使用 Cython/GCC++ 对其进行编译,然后将其绑定到SquareGrid主脚本中的对象就足够了。这就是我定义的方式passable_cy.pyx

随附setup.py文件:

这就是我将新的 cynthonized 方法绑定到SquareGrid主 A* python 脚本中的方式:

一切都正确编译,整个事情执行没有问题。没有任何速度改进,这是我所预料的(似乎太简单了)。我该如何从这里开始?这种方法绑定是最好的方法吗?我确信在 中可以做更多的事情passable_cy.pyx,但是我对 C/C++ 太不熟悉了,不知道该怎么做。