问题标签 [typed-memory-views]

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 投票
0 回答
109 浏览

performance - 在 Cython 中访问内存类型的视图很慢

我正在尝试创建一个自定义版本的 numpy.argmin ,它遍历二维数组并找到最小值(这是一个自定义版本,因为我有一些特定于域的信息 numpy 没有,这将导致更快的执行)。

我的第一个实现是这样的:

这大约是 numpy 自己的 argmin 的两倍。问题在于访问内存视图。它很慢。一旦我添加了一些指针:

性能非常接近 numpy 的 argmin。

我注意到一维内存类型视图也发生了同样的情况,需要我在迭代之前用指针替换每个视图。

我在我的 pyx 文件的顶部有以下声明,只是为了确保。

0 投票
1 回答
810 浏览

cython - Cython - 返回任意长度的 Typed MemoryView

我编写了一个 Cython 函数,该函数将数字的列表/类型化内存视图作为参数并返回相同长度的类型化内存视图:

在对其进行了数千次测试后,我开始收到Segmentation fault (core dumped)错误消息。我意识到这是一个内存管理问题,但我找不到如何管理函数返回的类型化内存视图的内存的示例。我发现的唯一有用信息是关于内存分配的信息,它建议将生命周期与result_arrpython 对象联系起来,并使用一种__dealloc__方法来释放内存。

有没有一种方法来管理 memoryview 垃圾收集,它不涉及创建用于释放内存的 python 类?

编辑:我试过这个,它似乎以正确的方式释放内存。

为什么这行得通,是否有更好的方法来管理内存?

0 投票
4 回答
5127 浏览

python - 在字节对象上获取指向python memoryview的指针

我有一个 pythonmemoryview指向一个bytes我想在 cython 中执行一些处理的对象。

我的问题是:

  • 因为bytes对象不可写,cython 不允许从中构造类型化(cython)内存视图
  • 我也不能使用指针,因为我无法获得指向 memoryview 开始的指针

例子:

在蟒蛇中:

在赛通中:

  • cdef char * my_ptr = &array[0]无法编译并显示以下消息:Cannot take address of Python variable
  • cdef char[:] my_view = array在运行时失败并显示以下消息:BufferError: memoryview: underlying buffer is not writable

如何解决这个问题?

0 投票
1 回答
852 浏览

python - 尝试使用 Cythons 内存视图时出现语法错误

我正在关注这个关于 memoryviews 的指南

但是当我在 Jupyter 的快速入门部分尝试代码时,它给出了这个错误:

图片

我什至不知道如何搜索此错误,因为它与语法相关,但 Cython.org 建议使用此语法。我认为这可能是因为我在错误的地方使用了这段代码(而不是在 Jupyter 平台上)。

任何建议,将不胜感激。

0 投票
1 回答
363 浏览

python - 类型转换错误 '__Pyx_memviewslice' 到 'double *' Cython,什么是等价的?MKL 功能范围代码

我编写了一个 Cython 程序,调用 Intel MKL 进行矩阵乘法,目的是使其并行。它基于链接到 BLAS 的旧 SO 帖子,并使用了一堆我从未见过的 Cython 方法,但它可以正常工作,而且它比 NumPy(也链接到 MKL)慢得多。为了加快速度,我使用了典型的 Memoryview 格式(它使用ndarray np.float64_t数据类型进行几个操作)。但现在它不再使用double[::1]Memoryviews 工作。这是生成的错误: 'type cast': cannot convert from '__Pyx_memviewslice' to 'double *'

由于类型转换不起作用,MKL 函数只能看到 5 个参数中的 3 个: error C2660: 'cblas_ddot': function does not take 3 arguments

这是 .PYX 代码:

我敢肯定,SO 上的某个人很容易指出这一点。如果您看到可以改进的地方,请告知 - 这是被黑客攻击和切碎的,我认为甚至不需要 i / j 循环。最干净的例子:https ://gist.github.com/JonathanRaiman/f2ce5331750da7b2d4e9我最终编译的实际上要快得多(2x),但没有给出任何结果,所以我将它放在另一篇文章中(这里:直接调用 BLAS / LAPACK使用 SciPy 界面和 Cython - 以及如何添加 MKL

非常感激。

0 投票
1 回答
1450 浏览

python-3.x - 在 Cython 脚本中使用 memset 而不是 np.zeros 来提高速度

我开始研究 Fortran 库 (BLAS/LAPACK) 的 SciPy 接口,可以在这里看到:Calling BLAS / LAPACK directly using the SciPy interface and Cython并想出了一个解决方案,但不得不求助于使用numpy.zeros它实际上杀死了任何速度直接调用 Fortran 代码的好处。问题是 Fortran 代码需要一个 0 值的输出矩阵(它在内存中就地处理矩阵)以匹配 Numpy 版本(np.outer)。

所以我有点困惑,因为 Python 中的 1000x1000 零矩阵只需要 8us(使用 %timeit 或 0.008ms)那么为什么添加 Cython 代码会杀死运行时,注意到我也在 memoryview 上创建它?(基本上 1000 x 1000 矩阵乘法从 3ms 到 8ms 左右)。然后在 SO 上搜索后,我在其他地方找到了一个使用memset最快的数组更改机制的解决方案。因此,我将引用帖子中的整个代码重写为更新的memoryview格式,并得到了类似这样的内容(Cythoncyblas.pyx文件):

测试脚本

因此,这解决了我将输出矩阵值重置为第 125 行的问题,该问题仍然存在(已解决见下文)。我认为将memset长度参数设置为 M*N 会清除内存中的 1000*1000 ,但显然不是。

有人知道如何使用 将整个输出矩阵重置为 0memset吗?非常感激。

0 投票
2 回答
905 浏览

python - 在 cython 中如何实现更好的循环速度性能?

我已经在 python 中启动了一个项目,该项目主要由循环组成。几天前,我读到了 cython,它可以帮助您通过静态类型获得更快的代码。我开发了这两个函数来检查性能(一个在 python 中,另一个在 cython 中):

毕竟我使用下面的代码来测试性能:

但是我没有发现任何明显的改进。我还没有使用 Typed-Memoryviews。任何人都可以提出有用的解决方案来提高速度或帮助我使用 typed-memoryview 重写代码吗?

0 投票
1 回答
348 浏览

cython - 如何访问在 cython 中声明的类的类型化内存视图元素?

我是初学者,我相信这个问题太简单了。我正在尝试在 cython 中测试内存视图以更好地了解它们。在我的代码中,我将每个内存视图元素(如[1,2])作为cy类元素传递move

当我打印结果时。我明白了:

我需要cy班级打印一份清单。我该如何解决?当我使用此代码时,我遇到了另一个问题:

运行此代码后,我总是收到此错误:
TypeError: a bytes-like object is required, not 'int'. 是什么导致了这个错误,我该如何解决这个错误?

0 投票
2 回答
547 浏览

python - 循环检查两个内存视图的有效方法是什么?

我想通过使用 memoryviews 来加速我的代码。这是我使用的两个类:

这是我要检查类是否有效的代码:

我希望打印 100 个,ok但我什么也没得到。我知道如果我使用list(move) == list(ch.move)我可以获得预期的输出,但我不希望循环中的转换开销。

谁能帮我一个有效的方法?如果有人有任何其他可以提高代码速度的建议,我们将不胜感激。

0 投票
1 回答
190 浏览

python - 为什么与 python 1 相比,cython 循环的性能在速度方面有所下降?

我正在尝试通过使用 cython 功能来提高我的 python 代码的速度。我的python代码由类和py_child函数组成,如下所示:py_parentpy_backup

这与cython使用 memoryviews 作为一些变量的实现相同:

现在我想评估函数 cy_backup、py_backup 的代码速度。所以我使用以下代码:

当我运行程序时,我对结果感到惊讶:

我期待 cython 比 python 快得多,特别是在使用 memoryviews 时。
为什么 cython 中的循环运行速度比 python 中的循环慢?
如果有人对加速 cython 中的代码有任何建议,我们将不胜感激。
提前我为我的问题道歉,包括太多的代码。