问题标签 [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 优化 NumPy
我目前正在尝试优化我用纯 Python 编写的代码。当我使用 NumPy 数组时,此代码非常频繁地使用NumPy 。下面你可以看到我转换为Cython的最简单的类。它只做两个 Numpy 数组的乘法。这里:
我的问题是,如果以及如何优化它,当我查看“cython -a”生成的 C 代码时,有很多 NumPy 调用,这看起来效率不高。
我的想法是使用两个for
循环并遍历数组的条目。也许我可以使用编译器通过 SIMD 操作来优化它?!我试过了,我可以编译它,但它给出了奇怪的结果并且花了很长时间。下面是替换函数的代码:
然而,正如我所说,这段代码真的很慢,并且不能按预期运行。那么我做错了什么?优化这一点并删除 NumPy 调用操作的最佳方法是什么?
python - 优化我的 Cython/Numpy 代码?到目前为止只有 30% 的性能提升
为了加快速度,我在这里忘记做什么了吗?我正在尝试实现名为 Tuning Timbre Spectrum Scale 的书中描述的算法。另外——如果一切都失败了,有没有办法让我用 C 语言编写这部分代码,然后可以从 python 调用它?
代码链接:Cython 代码
cython - 在 cython 中包装具有多个输出的库函数
我正在尝试使用 Cython 包装一个虚拟 C 库。
这是库的 .h 文件...
我用 cython 包装前 2 个函数没有问题,但在包装第 3 个函数时遇到问题。
第三个函数将 x 除以 y 并在指向双参数的第三个指针中返回答案。该函数本身返回成功或失败。
我想要包装的实际库充满了这种情况,其中它返回状态代码并且函数的实际输出通过指针返回。
包装这些功能的正确方法是什么?
谢谢,~埃里克
python - 使用 cython 对 python 中的小数组进行有效的数学运算
我使用 numexpr 对大型数组进行快速数学运算,但如果数组的大小小于 CPU 缓存,则使用简单的数组数学在 Cython 中编写我的代码要快得多,尤其是在多次调用该函数的情况下。
问题是,你如何在 Cython 中使用数组,或者更明确地说:Cython 中是否有 Python 的 array.array 类型的直接接口?我想做的是这样的(简单的例子)
我首先尝试使用 Cython numpy 包装器并使用 ndarrays,但与使用 malloc 创建 C 数组相比,创建它们似乎对于小型 1D 数组非常昂贵(但内存处理变得很痛苦)。
谢谢!
python - 概率解析器的内存使用情况
我正在为范围连接语法编写 CKY 解析器。我想使用树库作为语法,所以语法会很大。我用 Python 写了一个原型1,当我模拟几十个句子的树库时,它似乎工作得很好,但是内存使用是不可接受的。我尝试用 C++ 编写它,但到目前为止这非常令人沮丧,因为我以前从未使用过 C++。这是一些数据(n是语法所基于的句子数):
考虑到最佳优先算法,这种增长模式是可以预期的,但开销的数量是我关心的问题。根据 heapy 的内存使用量比这些数字小十倍,valgrind 报告了类似的情况。是什么导致了这种差异,我可以在 Python(或 Cython)中做些什么?也许是因为碎片化?或者可能是 python 字典的开销?
一些背景知识:两个重要的数据结构是将边映射到概率的议程和图表,它是将非终结符和位置映射到边的字典。议程通过 heapdict(内部使用 dict 和 heapq 列表)实现,图表带有将非终结符和位置映射到边缘的字典。议程经常被插入和删除,图表只得到插入和查找。我用这样的元组表示边:
字符串是语法中的非终结符标签,位置被编码为位掩码。当成分不连续时,可能有多个位置。所以这条边可以表示对“玛丽快乐”的分析,其中“是”和“快乐”都属于副总裁。图表字典由这条边的第一个元素索引,(“S”,111)在这个在一个新版本中,我尝试转置这个表示,希望它可以通过重用来节省内存:
我认为如果第一部分与不同的位置组合出现,Python 只会存储一次,尽管我实际上不确定这是真的。在任何一种情况下,它似乎都没有任何区别。
所以基本上我想知道的是是否值得进一步追求我的 Python 实现,包括使用 Cython 和不同的数据结构做事,或者用 C++ 从头开始编写它是唯一可行的选择。
更新:经过一些改进后,我不再遇到内存使用问题。我正在开发优化的 Cython 版本。我会将赏金奖励给提高代码效率的最有用的建议。在http://student.science.uva.nl/~acranenb/plcfrs_cython.html有一个带注释的版本
1 https://github.com/andreasvc/disco-dop/ -- 运行 test.py 来解析一些句子。需要 python 2.6、nltk和heapdict
python - Cython 正确性
Cython 生成的代码是否总是与生成它的 Python 代码一样正确?
它可以帮助其他读者解决 Cython 静态类型声明和其他 Cython 功能(如果有)的使用,尽管我只对通过将 Python 模块重命名为 *.pyx 来创建 Cython 文件的情况感兴趣。
我只关心 Cython 涵盖的 Python 子集。
c++ - 如何在 Cython 中声明指针向量?
我想声明这样的事情:
但是 Cython 给了我这个错误:
python - 使用 Cython 为困难的 C 头文件编写 Python 包装器
不久前,我使用 ctypes 围绕商业 DAQ 库编写了一个瘦包装器。从那时起,我遇到了 Cython 并想试一试,认为它可能会使它比以前更好/更干净。大多数 Cython 文档都是有道理的,我发现了我所知道的大部分内容,但我包装的库是高度特定于 Windows 的,并且与标准 C/C++ 代码有些不同,至少就我而言告诉。
这是头文件中的几个片段,我不确定如何包装。
从我收集的信息来看,我可能可以在我的 cython 定义中忽略大部分内容?我试过用 gcc 编译 C 代码,但它在每个函数定义中都会抛出错误。使用 ctypes 我直接访问了库,根本没有使用头文件。
这基本上是大多数函数的声明和操作方式。它们只返回错误代码,所有重要的信息都是通过指针完成的。我在文档中找不到关于如何使用返回类型指针的任何内容,我可能看起来不够努力。
谁能指出我包装这些功能的正确方向?
像 DaqError 这样的东西实际上是在头文件中声明的枚举,它们在这个库中疯狂地枚举,大约 1500 行。
谢谢你的帮助,
python - 逆向工程师自动生成的 C?
对自动生成的 C 代码进行逆向工程有多容易?我正在开发一个 Python 项目,作为我工作的一部分,我正在使用 Cython 编译代码以加快速度。
这确实有助于提高速度,但是,我担心在我工作的地方,有些人会尝试“窥视”代码并弄清楚它的作用。
Cython 代码基本上是自动生成的 C。逆向工程很难吗?
是否有任何建议可以使代码更安全且更难进行逆向工程?(我假设只要付出足够的努力,一切都可以逆向工程)。
python - Cython Damerau-Levenshtein 加速
根据这篇维基百科文章,我有以下计算 2 个字符串的 Damerau-Levenshtein 距离的 cython 实现,但目前它对我的需求来说太慢了。我有一个大约 600000 个字符串的列表,我必须在该列表中找到拼写错误。
如果有人能提出任何算法改进或一些可以减少脚本运行时间的 python/cython 魔法,我会很高兴。我并不真正关心它使用了多少空间,只关心计算所需的时间。
根据使用大约 2000 个字符串对脚本进行分析,它在damerauLevenshteinDistance
函数中花费了 80% 的完整运行时间(30 秒中的 24 秒),我完全不知道如何让它更快。