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

python - Cython: Buffer type mismatch, expected 'int' but got 'long'

I'm having trouble passing in this memoryview of integers into this (rather trivial) function. Python is giving me this error:

Can someone help me understand what's going on? Searching around stackoverflow, it seems that it has to do with how python interprets types, and how C interprets types.

This produces the ValueError from above.

EDIT: Here are some other things I've discovered.

To clarify, this error persists if I declare y the following ways:

However, it works if I declare y with

Does anyone want to give a suggestion why this is the case? Would throwing in np.int32 work on different computers? (I use a macbook pro retina, 2013.)

0 投票
2 回答
3607 浏览

python-3.x - mpi4py 中的共享内存

我使用MPI( mpi4py) 脚本(在单个节点上),它适用于非常大的对象。为了让所有进程都可以访问该对象,我通过comm.bcast(). 这会将对象复制到所有进程并消耗大量内存,尤其是在复制过程中。因此,我想共享指针之类的东西,而不是对象本身。我发现了一些memoryview有用的特性来促进进程内对象的工作。对象的真实内存地址也可以通过memoryview对象字符串表示来访问,并且可以像这样分布:

这打印:

这就是为什么我相信必须有一种方法可以在另一个过程中重构对象。但是,我在文档中找不到有关如何执行此操作的线索。

简而言之,我的问题是:是否可以在同一节点上的进程之间共享对象mpi4py

0 投票
1 回答
447 浏览

numpy - cython memoryview 不比 ndarray 快

我有一个用常规编写的函数numpy ndarray,另一个用typed memoryview. 但是,我无法让该memoryview版本比普通版本运行得更快(不像许多博客,例如memoryview benchmarks)。

任何提高 memoryview 代码速度与 numpy 替代方案的指针/建议将不胜感激!...或者...如果有人能指出任何明显的原因,为什么 memoryview 版本并不比常规 numpy 版本快多少

在下面的代码中有两个函数,它们都接受两个向量bixi返回一个矩阵。第一个功能shrink_correl是常规的 numpy 版本,第二个功能shrink_correl2是 memoryview 替代方案(让文件成为sh_cor.pyx)。

这是使用以下setup.py代码编译的

用于测试速度的代码是

我的电脑上的输出是:

使用 memoryview(在上面的代码中)只给我 5% 的速度提升(不像博客中的巨大速度提升)。

0 投票
1 回答
845 浏览

python - 使用 memoryview (Python 3.5.0) 更慢的切片分配

我有一个大字节数组 x 并想将它的一部分分配给另一个字节数组 y 的一部分

我认为使用 memoryview 会更快,而且确实

非常快。然而,

需要 5 倍的时间y[::6] = x[:2*10**6:2]

  1. 我是否遗漏了什么,或者这是否是 Python 中的一个错误?
  2. 如果我想重复分配已知数量的 0 和 (b) 通常在 Python (a) 中执行此操作的最快方法是什么?
0 投票
1 回答
377 浏览

numpy - 类型化的 Memoryview 会增加 numpy.array 的引用计数吗?

下面显示的某些类型的代码导致我在通过 Cython 调用的 C++ 代码中出现内存损坏。我已经设法解决它,但想问什么是最低限度要求是多少。

认为:

  • CFoo是一个 C++ 类,其中一些成员set_ptr采用指向双精度的指针。Cython 类Foo拥有一个指向CFoo.
  • 在某种bar方法内Foo
    • 通过调用创建瞬态numpy.array, 。afunction_returning_a_numpy_array()
    • 创建一个类型化的内存视图a_view以供查看a
    • 一个指针 froma_view被发送到CFoousingCFoo的成员set_ptr

片段:

请注意,在这个问题的上下文中,后续调用Foo将导致CFoo对该指针进行操作。

很明显,由于没有保存任何内容a,后续调用Foo's 成员可以找到areclaimed 的内存。我已经通过创建a一个成员解决了这个问题Foo。我的问题是:

  • 这会通过使double *(设置为&a_view[0])成为 的成员来解决Foo吗?我猜没有。

  • 这会通过使double a_view[:](设置为a)成为 的成员来解决Foo吗?我在文档中找不到任何解决此问题的方法。

0 投票
0 回答
420 浏览

python-3.x - 使用 memoryView 操作大缓冲区

我的应用程序需要一个 C 库。在某些时候,该库提供了一个指向充满二进制结构的大缓冲区的指针。我不想从/复制到大缓冲区。我想通过 bytearray 类的 memoryView 操作缓冲区。
在 Python3.4 中,我尝试将 C 指针输入 ctypes.PyMemoryView_FromMemory 但它似乎返回一个 Int 对象。
将缓冲区地址设置为字节数组的 memoryView 的最佳方法是什么?
如果可能的话,我宁愿不使用 Cython。

谢谢!

0 投票
1 回答
659 浏览

python - Cython:释放内存的内存视图

在 Cython 代码中,我可以分配一些内存并将其包装在内存视图中,例如:

如果我现在使用 释放内存PyMem_Free(ptr),则尝试访问类似的元素ptr[i]会引发错误,这是应该的。但是,我可以安全地尝试访问view[i](虽然它不会返回原始数据)。

我的问题是:释放指针总是安全的吗?内存视图对象是否以某种方式通知内存被释放,或者我应该以某种方式手动删除视图?此外,即使内存视图引用了内存,是否也能保证释放内存?

0 投票
1 回答
853 浏览

python - Cython memoryviews 错误:指定的 memoryview 索引无效

我正在尝试使用 memoryviews 在 cython 中实现标准快速排序。这是我的代码:

但是,在使用标准setup.py文件和python setup.py build_ext --inplace命令编译期间,我收到有关 memoryview 访问的多个错误:

有人可以告诉我我做错了什么吗?由于我是 Cython 的新手,因此任何提高性能的技巧都将不胜感激。谢谢!

0 投票
1 回答
1067 浏览

python - Cython memoryviews:用数组参数包装c函数以传递numpy数组

我正在尝试使用 Cython 用数组参数 ( quick_sort()) 包装 c 函数,因此我可以将一个 numpy 数组传递给它。我已经在文档、SO 和网络上搜索了一个有效的、最小的示例,但没有找到。我已经尝试了几种可能性,但没有任何进展,所以请帮我弄清楚。这是我的文件:

快速排序.c

快速排序.h

快速排序.pxd

cy_quicksort.pyx

安装程序.py

当我运行python setup.py build_ext --inplace命令时,它返回以下错误:

我想要实现的是编译它并能够运行,例如:

在此先感谢您的时间!


编辑:

在 DavidW 在 quicksort.pxd 、 cy_quicksort.pyx 中建议的更改并将setup.py文件更改以下形式后,它按预期工作。

安装程序.py

0 投票
1 回答
7547 浏览

python - Cython 键入的内存视图:它们到底是什么?

Cython文档很好地解释了它们允许的内容、如何声明它们以及如何使用它们。

但是,我仍然不清楚它们到底是什么。例如,来自 numpy 数组的简单赋值是这样的:

可以使访问/分配my_arr更快。

幕后发生了什么?Numpy 应该已经以连续的方式分配内存中的元素,那么 memoryviews 是怎么回事呢?貌似没那么多,其实numpy数组的memoryview赋值new_arr应该相当于

在速度方面。然而,memoryviews 被认为比 numpy 数组缓冲区更通用;你能举一个简单的例子,其中添加的“概括”很重要/有趣吗?

此外,如果我已经分配了一个指针以使事情尽可能快,那么将其转换为类型化的 memoryview 有什么好处?(这个问题的答案可能与上述相同)