问题标签 [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.
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 我得到了它的工作。
python - 有什么方法可以设置用ucs2编译的cython?
Cython 将 python 代码转换为共享对象时遇到问题。
设置文件在这里:
因此,在我转移到 CentOS 的 Ubuntu 桌面实用程序上一切正常。
得到错误:
未定义符号:PyUnicodeUCS4_DecodeUTF8
我用谷歌搜索,发现有很多问题,但是,几乎所有人都说根本原因是带有 UCS2 或 UCS4 的 python,我理解这一点,没有找到解决这个问题的方法。
IMO,解决方法:
- 通过“--enable-unicode=ucs4/ucs2”重建python以获得正确的版本
但我需要重新安装所有软件包
- 从另一个具有正确 UCS 的 python 的桌面编译代码
现在,我想是否有办法将 Cython 设置为使用指定的 UCS 模式进行编译。
任何建议都非常感谢。
谢谢。
multithreading - 使用 Cython 启用并行性
我正在尝试使prange
Cythonparallel
包的功能正常工作,似乎没有并行性。为了拥有 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 上运行测试。
python - 从 Cython 的列表中调用方法
我想在 Cython 的 prange 循环中并行执行 3 个采用相同输入的函数。他们在相同的变量TV
和上添加值,并du
采用相同的变量。代码的目的是计算四个主要方向上的像素梯度,然后按像素计算总变化。
为此,我创建了一个包含方法名称的列表并遍历该列表。我有这个代码:
虽然它在纯 Python 中工作,但 Cython 在编译时失败:
有什么意思吗?
编辑:
这个概念证明有效:
python - 将 dask 与 cythonized 类一起使用。对象方法的酸洗错误
我想用以下类对python模块进行cythonize:
安装 cythonized 模块后,我正在尝试执行代码:
我有酸洗错误(静态和非静态方法相同):
为什么会这样?
python - Python DLL 与 C++ DLL
我已经阅读了网络上的各种文章,以对 DLL 有一些基本的了解。
据我了解,DLL 是二进制文件,因此如果我能够使用Cython.build
包从 Python 脚本生成 DLL,那么与原始 Python 脚本相比,DLL 将加快速度。
如果没有 C++ 代码优化,使用的 DLL 是否会Cython.build
提供与具有相同逻辑的本地 C++ 代码相同的速度。
还是我以上的理解都是错误的?
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)。
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 库进行套接字编程。
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++ 太不熟悉了,不知道该怎么做。