相关疑难解决方法(0)

字符串切片是否在内存中执行复制?

我想知道是否:

a = "abcdef"
b = "def"
if a[3:] == b:
    print("something")
Run Code Online (Sandbox Code Playgroud)

实际上是否执行了a内存中某处“def”部分的副本,或者是否就地完成了字母检查?

注意:我说的是一个字符串,而不是一个列表(我知道答案)

python python-3.x

40
推荐指数
1
解决办法
2015
查看次数

应该何时使用内存视图?

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

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

A memoryview具有元素的概念,元素是由始发对象obj处理的原子存储单元.对于许多简单类型,例如bytesbytearray,元素是单个字节,但是其他类型array.array可能具有更大的元素.

python python-3.x memoryview

29
推荐指数
1
解决办法
8872
查看次数

在MATLAB R2018a及更新版本中,无需数据复制即可将复杂转换为实数

MATLAB R2018a以来,复值矩阵在内部存储为单个数据块,每个矩阵元素的实部和虚部存储在彼此相邻的位置 - 它们称之为"交错复合体".(以前这样的矩阵有两个数据块,一个用于所有实际组件,一个用于所有虚构组件 - "单独复杂".)

我认为,由于存储现在允许它,因此应该可以将复值数组转换为具有两倍元素的实值数组,而无需复制数据.

MATLAB有一个函数typecast,它将数组转换为不同类型而不复制数据.例如,它可以用于将具有16个8位值的数组转换为具有2个双浮点数的数组.它在不复制数据的情况下执行此操作,将位模式重新解释为新类型.

遗憾的是,这个函数在复值数组上根本不起作用.

我想复制这段代码:

A = fftn(randn(40,60,20)); % some random complex-valued array
assert(~isreal(A))

sz = size(A);
B = reshape(A,1,[]);        % make into a vector
B = cat(1,real(B),imag(B)); % interleave real and imaginary values
B = reshape(B,[2,sz]);      % reshape back to original shape, with a new first dimension
assert(isreal(B))
Run Code Online (Sandbox Code Playgroud)

矩阵AB(在R2018a和更新版本中)完全相同的数据,完全相同的顺序.但是,为了达到目的,B我们必须将数据复制两次.

我尝试创建一个MEX文件来执行此操作,但我没有看到如何创建一个引用输入数组中的数据的新数组.这个MEX文件有效,但是在清除变量时会导致MATLAB崩溃,因为有两个数组引用相同的数据而没有意识到它们共享数据(即引用计数没有递增).

// Build with:
//    mex -R2018a typecast_complextoreal.cpp

#include <mex.h>

#if MX_HAS_INTERLEAVED_COMPLEX==0
#error "This MEX-file …
Run Code Online (Sandbox Code Playgroud)

arrays matlab types casting complex-numbers

12
推荐指数
1
解决办法
461
查看次数