问题标签 [memoryview]

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 回答
352 浏览

python - cython memoryview 的慢速索引

我有一个非常稀疏的矩阵,比如 5000x3000,双精度浮点数。这个矩阵的 80% 是零。我需要计算每一行的总和。所有这些都在 python/cython 中。我想加快这个过程。因为我需要计算这个总和数百万次,所以我认为如果我制作非零元素的索引并仅对它们求和,它会更快。结果变得比所有零的原始“蛮力”总和慢得多。

这是一个最小的例子:

我在 Raspberry Pi 3 上运行它,但在 PC 上似乎也有相同的结果。

谁能解释为什么 cython 代码比 numpy 慢 3-4 倍?为什么索引,它将总和的数量从 2000000 减少到 400820,慢了 45 倍?这没有任何意义。

0 投票
1 回答
128 浏览

numpy - 如何在 cython 中键入我的变量,以便它们更快地传递到 memoryview 数组?

我正在尝试为 N 体积分器优化双循环,我发现我的代码的问题是当我将存储的变量写入内存视图位置时会产生巨大的开销。

我最初在 numpy 中对这段代码进行了矢量化处理,但是在另一个 for 循环中调用它来更新粒子位置,而且开销非常大。我有一个 np.ndarray Nx2 位置向量(X),我想返回一个 Nx2 动量向量(XOut)——下面列出的当前代码返回一个内存视图,但这没关系,因为我想最终嵌入这个一旦我调试了这个瓶颈,就可以在其他 Cython 函数中运行。

我尝试了 cython -a "name.pyx" 命令,发现我或多或少地将所有内容都作为 C 类型。但是,我发现在循环的底部,写入 XOut[ii,0] -= valuex 的内存视图会产生大部分运行时间。如果我将其更改为常数,以使 XOut[ii,0] -= 5,则代码将快 40 倍左右。我认为这意味着我正在在那条线上进行某种复制操作,这让我放慢了速度。我的 Cython/C++ 背景是初级的,但我认为我需要更改语法,以便从指针写入内存视图。任何建议将不胜感激;谢谢!

0 投票
1 回答
348 浏览

python - Python 中的 MemoryViews 和垃圾收集

基本上:

如果我在某处声明一个字节数组:

arr = bytearray(somestr)

然后创建它的内存视图:

view = memoryview(arr)

我可以确定只要我在某处引用了视图对象,字节数组就会保留吗?

IE:

垃圾收集会删除原始字节数组吗?或者这算作参考吗?

0 投票
1 回答
39 浏览

python - 此代码段中是否正确使用了 memoryview 对象?

我需要找到某个文本中出现的所有回文。我将从外部文件中提取数据。我需要注意数据的内存高效处理,因此我使用了 memoryview 对象。但是,我需要对 memoryview 对象执行一些字符串操作,所以我使用了 tobytes() 方法。这是在不复制数据的情况下处理这些对象的正确方法吗?

0 投票
1 回答
1008 浏览

android - Android Studio 有 NDK 内存查看器吗?

我正在将 Windows 的 C 库代码移植到 android

当我在 NDK C 代码中创建动态分配的数组时,变量查看器窗口只显示第一个元素的地址和第一个元素的值

我想查看手机内存中的 所有数组成员

android studio中是否有用于NDK的内存查看器或类似的东西?

或者作为替代方案,我可以在 lldb 控制台中进行某种内存转储吗?

0 投票
1 回答
455 浏览

python - python memoryview比预期慢

鉴于 Python 对缓冲协议的接口可以帮助减少制作临时数据副本的需要,我决定根据这个问题的答案memoryview对它进行快速测试。

结果:

前两个结果似乎是一个相当令人惊讶的结果。我知道调用列表将涉及数据的副本,但我认为在切片内存视图而不是底层字节数组时,您可以保存临时副本。

0 投票
1 回答
348 浏览

python - Cython:将单个元素分配给多维内存视图切片

每当我将单个值分配给多维内存视图的切片时,Cython 似乎使用了错误的跨步,除非切片沿第一个维度。我在下面给出一个完整的例子:

如果我们在 Python 中运行它(例如python3 -c 'import bug; bug.bug()'),我们得到

正如预期的那样打印出来。我现在通过将文件重命名为 用 Cython 编译它,bug.pyx将以下内容保存在Makefile同一目录中,

并运行make。再次运行python3 -c 'import bug; bug.bug()'它现在拿起已编译bug.so的,再次打印出来

如果我们现在取消注释cdef声明,运行makepython3 -c 'import bug; bug.bug()'再次,我们得到

这是错误的。我不相信int[:, ::1]声明是错误的,因为 Cython 会抱怨。如果我用它替换它就int[:, :]可以了。此外,如果我分配给 , 的第一个维度aa[:1, :] = 1它会起作用。

这是一个已知问题,还是我以某种方式误解了 Cython 内存视图的这种看似基本的用法?

0 投票
1 回答
212 浏览

python - 如何解压 Cython memoryview

我有一个 32 位无符号整数的内存视图,我想将其解压缩为一些字符、整数和字符串(或必要时的字符数组)。

此二进制文件的前 192 个字节用作包含有关文件其余部分的元数据的标头。

我想从 memoryview (或 memoryviewslice: bin_file[:48])中解压缩这些字节

从 memoryview 中获取 int 很容易:

但是,我不确定获取其他数据类型的最佳方法,尤其是那些跨越内存视图中多个条目的数据类型。

我希望能够使用类似于

但这只是给出一个错误,说“无法将类型'const unsigned int [:]'分配给'char [12]'”。

0 投票
1 回答
428 浏览

python - 如何在 Cython 中有一个内存视图列表?

我的函数接受不同大小的 numpy 数组列表:

def function1(list list_of_numpy_arrays):

现在我正在做:

cdef int[:] a_view = list_of_numpy_arrays[index]

问题是我必须多次索引列表,因此开销大大增加了时间(10 倍)。我正在寻找cdef int[:] a[5]可以拥有一组内存视图的地方,这样我就可以避免索引 python 列表的开销。

如果有解决方案,我也可以传入列表列表。

def function2(list list_of_lists):

0 投票
2 回答
782 浏览

python - Cython 中动态数组的 2D MemoryView

我知道这个问题,但我一直在寻找一种更简单的方法来从 C 数组生成 2d 内存视图。由于我是 C 和 Cython noobie,有人可以解释一下为什么像

不行吗?

编译时我得到Cannot assign type 'int[::1]' to 'int'错误。这是否意味着 2d memview 被第一个 assign 语句折叠到 1d 或者是因为 memoryviews 需要连续块等?