问题标签 [cython]
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 - 在 cython 中编译时如何删除 python 断言?
所以,这是我的问题:我在 python 中编写代码,但我需要提高我的代码中某些部分太慢的性能。一个好的(和简单的)解决方案似乎是使用 cython;我试过了,结果很好。问题是我在 python 代码中使用了 assert 语句。在使用 cython 之前,我可以使用 -OO 选项编译我的 python 代码,这样我就可以交付一个不执行任何断言测试的版本,并且仍然拥有用于调试的断言。但是在 cython 中编译的文件似乎总是执行断言。是否有一些选项可以传递给 cython 编译以删除(或不删除)断言?
python - 将 lambda 函数与 Cython 一起使用时出错
我正在尝试使用 Cython 来加速一段代码。当我使用 lambda 函数时,Cython 给出了一个错误,上面写着“需要一个标识符或文字”。据我所知,Cython 0.13 支持 lambda 函数。我在这一点上不正确吗?如果它们确实受到支持,我是否需要做一些除了我在这里实现它们之外的事情?
python - 使用 cython 将模块移植到 python 3.1
是否可以在 cython 中导入任意模块,将它们编译为共享对象文件,然后在 python 3.1 中使用它们?
这样做的原因是,我正在为程序“blender”编写一个扩展,它有一个内部 python 3.1 解释器。但我也想使用一些尚未移植到 3.x 的 python 模块
我特别想到了 numpy(还有其他一些库)。我有一个模块,它使用 numpy. 由于我想重新分发该模块,我不希望人们在他们的机器上安装 numpy。那行得通吗?
python - 用 C 函数扩展 Numpy
我正在尝试加速我的 Numpy 代码,并决定我想实现一个特定的功能,我的代码大部分时间都在 C 中。
我实际上是 C 语言的新手,但我设法编写了将矩阵中的每一行归一化为总和为 1 的函数。我可以编译它并用一些数据(用 C 语言)对其进行测试,它可以满足我的需求。那时我为自己感到非常自豪。
现在我试图从 Python 调用我的光荣函数,它应该接受一个 2d-Numpy 数组。
我尝试过的各种事情是
痛饮
痛饮+
numpy.i
类型
我的函数有原型
所以它需要一个指向可变长度数组的指针并就地修改它。
我尝试了以下纯 SWIG 接口文件:
然后我会做(在 Mac OS X 64bit 上):
在 Python 中,我在导入模块时收到以下错误:
接下来我使用 SWIG + 尝试了这种方法numpy.i
:
但是,我没有比这更进一步:
SWIG 似乎找不到在 中定义的类型映射numpy.i
,但我不明白为什么,因为numpy.i
它在同一个目录中,并且 SWIG 不会抱怨它找不到它。
使用 ctypes 我并没有走得太远,但很快就迷失在文档中,因为我不知道如何将它传递给二维数组,然后将结果取回。
那么有人可以向我展示如何使我的函数在 Python/Numpy 中可用的魔术吗?
python - ctypes、pyrex、swig 或 cython 解决这个问题?
我有大约 20 个简单的 C++ 类,它们代表各种概率分布。我想在 Python 中提供这些。最简单的方法是什么?我不介意让程序自动生成包装器,但我不想重新输入类。
此外,我的一些课程使用 Boost uBLAS 库。有没有办法从 Python 自动传入 numpy 数组?
python - Cython、C 和 Fortran
我想请教一下关于通过 C 函数调用 fortran 函数的问题。这些 C 函数将通过 cython 在 python 代码中使用。把事情放在一起,我有这个方案:
Cython 模块 -> C 函数 -> Fortran,其中 -> 表示“调用”。
目前我设法从 cython 调用 C 函数,但我很难调用 fortran 函数。你能帮我吗?(一个简单的例子会很棒)。
提前致谢。编辑:我正在使用 gcc 4.1.2。和 gfortran
python - 使用 C 扩展 numpy 时如何考虑列连续数组
我有一个 C 函数来规范化日志空间中数组的行(这可以防止数值下溢)。
我的 C 函数原型如下:
您可以看到它需要一个指向数组的指针并就地修改它。C 代码当然假定数据保存为 C 连续数组,即行连续。
我使用 Cython 将函数包装如下(导入和cdef extern from
省略):
大多数时候 numpy-arrays 是行连续的,并且函数工作正常。但是,如果先前已经转置了 numpy-array,则不会复制数据,而只会返回数据的新视图。在这种情况下,我的函数失败,因为数组不再是行连续的。
我可以通过将数组定义为具有 Fortran 连续顺序来解决此问题,这样在转置后它将是 C 连续的:
显然这很容易出错,用户必须注意数组的顺序是否正确,这是用户在 Python 中不需要关心的事情。
我如何使用行和列连续数组进行这项工作的最佳方法是什么?我认为 Cython 中的某种数组顺序检查是可行的方法。当然,我更喜欢不需要将数据复制到新数组中的解决方案,但我几乎认为这是必要的。
python - Cython 字节到 C char*
我正在尝试为 CPython 编写一个 Cython 扩展来包装 mcrypt 库,以便我可以将它与 Python 3 一起使用。但是,我在尝试使用其中一个 mcrypt API 时遇到了段错误的问题。
失败的代码是:
现在,按照我对 Cython 文档的理解,第 3 行的赋值应该将缓冲区(Python 3 中的一个对象)的内容复制到 C 字符串指针。我认为这也意味着它将分配内存,但是当我进行此修改时:
它仍然因段错误而崩溃。它在 mcrypt_generic 内部崩溃,但是当我使用纯 C 代码时,我能够让它工作得很好,所以必须有一些我不太了解 Cython 如何在这里处理 C 数据的东西。
谢谢你的帮助!
ETA:问题是我的一个错误。在清醒了太多小时后,我正在研究这个(这不是我们在某个时候都做过的事情吗?)并且错过了一些愚蠢的事情。我现在拥有的有效代码是:
它可能不是世界上最有效的代码,因为它会复制一份来进行加密,然后再复制一份到返回值。不过,我不确定是否可以避免这种情况,因为我不确定是否可以获取新分配的缓冲区并将其作为字节串原地返回给 Python。但是现在我有了一个工作函数,我也将实现一个逐块的方法,这样就可以提供一个可迭代的块用于加密或解密,并且能够在没有整个源代码的情况下做到这一点并同时将所有目标都放在内存中-这样,就可以加密/解密大文件,而不必担心在任何时候在内存中最多保存三个副本...
谢谢大家的帮助!
c - Cython 是否支持三元风格的 if 语句(if ? then : else)?
(if ? then : else)
我忘记了C/C++ 格式的技术术语。此外,Cython(Python 的 C 变体)是否支持这种语法?
我需要知道技术名称,以便查找 Cython 是否支持此功能。
更新:有谁知道 Cython 是否支持这个?
解决方案:在 cython/python 中,这被写成(b if a else c)
比较(a ? b : c)