问题标签 [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 投票
2 回答
2044 浏览

python - 可以从左侧截断的 Python 缓冲区?

现在,我正在使用字符串、StringIO 或 cStringIO 缓冲字节。但是,我经常需要从缓冲区的左侧删除字节。一种天真的方法会重建整个缓冲区。如果左截断是一种非常常见的操作,是否有最佳方法来做到这一点?Python 的垃圾收集器实际上应该对截断的字节进行 GC。

任何类型的算法(将缓冲区分成小块?)或现有的实现,都会有帮助。

编辑:

我尝试为此使用 Python 2.7 的 memoryview,但遗憾的是,当删除原始引用时,“视图”之外的数据不会被 GC:

0 投票
2 回答
10621 浏览

python - 什么时候应该使用内存视图?

memoryview 的完整描述可以在这里找到:

创建一个memoryview引用obj的。obj必须支持缓冲区协议。支持缓冲区协议的内置对象包括bytesbytearray.

Amemoryview具有元素的概念,它是由原始对象obj处理的原子内存单元。对于许多简单类型(例如bytesand bytearray),元素是单个字节,但其他类型(例如)array.array可能有更大的元素。

0 投票
2 回答
3088 浏览

python - 为什么无法从数组对象中获取 Py_buffer?

数组上的python 文档清楚地指出数组符合缓冲区接口。它甚至建议不要使用 buffer_info() 方法。但是,当我尝试使用 PyObject_GetBuffer() 从 C/C++ 代码中获取 Py_Buffer 或使用 python 的 memoryview 时,我遇到了失败。

例如,在 python 中(我使用 2.7 版):

事实上,当我搜索 python 的代码库时,只有 bytearrayobject (bytearray)、memoryobject (memoryview) 和 stringobject (str) 设置了所需的 Py_TPFLAGS_HAVE_NEWBUFFER 标志。据我了解,文档是错误的;数组不支持缓冲区接口。

我可以使用支持缓冲区接口的 bytearray,问题是我需要数组的实用 fromfile() 方法来读取我可以在我的 C/C++ 代码中使用的缓冲区。

是否有替代方法可以让我将文件读入缓冲区并从 C 代码中使用此缓冲区,而不涉及内存副本?(我想处理大的二进制文件,复制是一个不太理想的选择)。

0 投票
2 回答
4816 浏览

python - 为非 C 程序员解释的缓冲区和 Memoryview 对象

Python 2.7为缓冲区和内存视图对象引入了一个新的 API 。

我阅读了关于它们的文档,我想我了解了基本概念(以原始形式访问对象的内部数据而不复制它,我认为这意味着获取对象数据的“更快且更少内存占用”的方式),但要真正理解文档,读者应该对 C 有一定的了解,这超出了我的掌握范围。

如果有人愿意花时间做以下事情,我将不胜感激:

  • 用“外行术语”解释缓冲区和 memoryview 对象,以及
  • 描述一个场景,其中使用缓冲区和 memoryview 对象将是做事的“Pythonic 方式”
0 投票
1 回答
535 浏览

windows-7 - cython:mingw 的 memoryview 构建错误

我一直在用 cython 编写一些 python 扩展模块。我编写的扩展构建并运行良好。然后,我想在访问我的 numpy 数组时使用类型化的 memoryviews,因为它们似乎有几个优点http://docs.cython.org/src/userguide/memoryviews.html

但是,一旦我在我的 cython 代码中使用 memoryview,我就会在构建扩展时遇到错误。例如,如果我添加此测试行:

cdef double[:, ::1] X = np.zeros((100, 100))

到现有的工作 cython 扩展。我会收到以下错误:

我已尝试将 -march=i486 添加到 gcc 行,如本文所述: undefined reference to sync_fetch_and_add_4 但这并没有解决问题。就此而言,我还尝试了 -march=i586 和 -march=pentium ,但均未成功。

知道这里发生了什么吗?

我的平台是Windows 7,mingw版本是4.70,Cython版本是0.17.1

谢谢

0 投票
1 回答
1701 浏览

python - cython memoryview 比预期慢

我已经开始在 cython 中使用 memoryviews 来访问 numpy 数组。它们具有的各种优势之一是它们比旧的 numpy 缓冲区支持快得多: http: //docs.cython.org/src/userguide/memoryviews.html#comparison-to-the-old-buffer-support

但是,我有一个例子,旧的 numpy 缓冲区支持比 memoryviews 更快!怎么会这样?!我想知道我是否正确使用了内存视图?

这是我的测试:

计时结果如下:

image_box1:键入 numpy:100000 个循环,最好的 3 个:每个循环 11.2 us

image_box2:memoryview:100000 个循环,最好的 3 个:每个循环 18.1 us

这些测量是从 IPython 使用 %timeit image_box1(im, pd, box_half_size) 完成的

0 投票
1 回答
1282 浏览

opencv - 将 cython 内存视图传递给 OpenCV 函数

我正在使用 cython memoryviews 来引用一些灰度图像。我已经在我编写的一些图像处理代码中成功地使用了它。现在,我需要使用一些 OpenCV 函数。不幸的是,我发现我无法将内存视图作为图像参数传递给 OpenCV 函数。代码可以编译,但是当它运行时,它会在 OpenCV 函数调用处停止,并显示“TypeError: is not a numpy array”

我可以使用 np.asarray(my_memoryview) 将 memoryview 转换回 numpy 数组。这可行,但它复制数据并且速度很慢。

在 memoryview 文档中,他们谈论强制转换为 numpy http://docs.cython.org/src/userguide/memoryviews.html#coercion-to-numpy 似乎我应该能够将 memoryview 强制转换为 numpy数组而不复制内存。但是,如果我写:

它会导致编译错误:“只能从指针或数组创建 cython.array”

任何有关如何将 memoryview 传递给 OpenCV 函数,或如何在不复制数据的情况下将 memoryview 强制转换为 numpy 数组的帮助将不胜感激!

0 投票
1 回答
1011 浏览

python - 如何比较 memoryview 对象?

有人对下面的代码有想法吗?

如何在不使用tobytes获取字符串副本的情况下比较 memoryview 对象的字符串?

0 投票
0 回答
106 浏览

ubuntu - Cython Memoryview 编译错误

我正在尝试获得 typed Memoryviewon Cython(Ubuntu 11.10 64bit)的好处,但即使在这个教科书示例中也会出现编译错误。不使用Memoryview生成的代码似乎可以编译。我正在使用 Python 2.7 从 Sage 工作并收到如下错误:

gcc -fno-strict-aliasing -fwrapv -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/sergey/Python/sage-5.5/local/include/csage -I/home/sergey/Python/sage-5.5/local/include -I/home/sergey/Python/sage-5.5/local/include/python2.7 -I/home/sergey/Python/sage-5.5/local/lib/python/site-packages/numpy/core/include -I/home/sergey/Python/sage-5.5/devel/sage/sage/ext -I/home/sergey/Python/sage-5.5/devel/sage -I/home/sergey/Python/sage-5.5/devel/sage/sage/gsl -I/home/sergey/.sage/sage_notebook.sagenb/home/admin/1/code -I/home/sergey/Python/sage-5.5/local/include/python2.7 -c _home_sergey__sage_sage_notebook_sagenb_home_admin_1_code_sage2_spyx_0.c -o build/temp.linux-x86_64-2.7/_home_sergey__sage_sage_notebook_sagenb_home_admin_1_code_sage2_spyx_0.o -w -O2

_home_sergey__sage_sage_notebook_sagenb_home_admin_1_code_sage2_spyx_0.c:2259:29: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘<strong>attribute’ before ‘.’ token _home_sergey__sage_sage_notebook_sagenb_home_admin_1_code_sage2_spyx_0.c:2261:44: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘<strong>attribute’ before ‘.’ token

建议的修复:

没有帮助 - 它给出了我的处理器不支持此类指令的错误。

在此先感谢,谢尔盖

0 投票
5 回答
57443 浏览

python - Python中的memoryview到底是什么

检查memoryview 上的文档:

memoryview 对象允许 Python 代码访问支持缓冲区协议的对象的内部数据,而无需复制。

内存视图(obj)

创建一个引用 obj 的 memoryview。obj 必须支持缓冲区协议。支持缓冲区协议的内置对象包括字节和字节数组。

然后我们给出示例代码:

报价结束,现在让我们仔细看看:

所以我从上面收集到的信息:

我们创建一个 memoryview 对象来公开缓冲区对象的内部数据而不进行复制,但是,为了对对象做任何有用的事情(通过调用对象提供的方法),我们必须创建一个副本!

当我们有一个大对象时,通常需要 memoryview(或旧的缓冲区对象),并且切片也可能很大。如果我们制作大切片,或者制作小切片但次数很多,则需要更高的效率。

使用上述方案,我看不出它对这两种情况有何用处,除非有人可以向我解释我在这里缺少什么。

编辑1:

我们有一大块数据,我们希望通过从头到尾遍历它来处理它,例如从字符串缓冲区的开头提取令牌,直到缓冲区被消耗。在 C 术语中,这是通过指针推进缓冲区,并且指针可以传递给任何期望缓冲区类型的函数。如何在 python 中完成类似的事情?

人们建议解决方法,例如许多字符串和正则表达式函数采用可用于模拟推进指针的位置参数。这有两个问题:首先它是一种变通方法,你不得不改变你的编码风格来克服这些缺点,其次:不是所有的函数都有位置参数,例如正则表达式函数和startswithencode()/decode()不做。

其他人可能会建议以块的形式加载数据,或者以大于最大令牌的小段处理缓冲区。好的,所以我们知道这些可能的解决方法,但是我们应该在 python 中以更自然的方式工作,而不是试图改变编码风格以适应语言 - 不是吗?

编辑2:

代码示例会使事情更清楚。这就是我想要做的事情,而且我认为 memoryview 乍一看会让我做的事情。让我们使用 pmview(正确的内存视图)来实现我正在寻找的功能: