相关疑难解决方法(0)

什么是严格别名规则?

当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?

c strict-aliasing undefined-behavior type-punning

778
推荐指数
10
解决办法
19万
查看次数

Python中的memoryview究竟是什么意思

检查内存视图上的文档:

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

class memoryview(obj)

创建一个引用obj的内存视图.obj必须支持缓冲协议.支持缓冲区协议的内置对象包括bytes和bytearray.

然后我们给出示例代码:

>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
Run Code Online (Sandbox Code Playgroud)

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

>>> b = b'long bytes stream'
>>> b.startswith(b'long')
True
>>> v = memoryview(b)
>>> vsub = v[5:]
>>> vsub.startswith(b'bytes')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'memoryview' object has no attribute 'startswith'
>>> bytes(vsub).startswith(b'bytes')
True
>>> 
Run Code Online (Sandbox Code Playgroud)

所以我从上面收集的内容:

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

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

有了上述方案,我看不出它对两种情况都有用,除非有人能向我解释我在这里缺少的东西.

EDIT1:

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

人们建议使用变通方法,例如许多字符串和正则表达式函数采用可用于模拟推进指针的位置参数.这有两个问题:首先是一个解决方法,你被迫改变你的编码风格来克服缺点,第二个:并非所有函数都有位置参数,例如正则表达式函数和startswithdo,encode()/ …

python buffer memoryview

68
推荐指数
3
解决办法
3万
查看次数

提高将numpy数组转换为MATLAB的性能

从Python调用MATLAB必然会通过在Python中重写(很多)代码来减少性能.然而,这对我来说不是一个现实的选择,但令我很恼火的是,效率的巨大损失在于从numpy数组到MATLAB double的简单转换.

我在谈论从data1到data1m的以下转换,其中

data1 = np.random.uniform(low = 0.0, high = 30000.0, size = (1000000,))
data1m = matlab.double(list(data1))
Run Code Online (Sandbox Code Playgroud)

这里matlab.double来自Mathworks自己的MATLAB包/引擎.第二行代码在我的系统上花费了20秒,对于一个除了使数字"可食用"MATLAB之外没有真正做任何事情的转换似乎太多了.

所以基本上我正在寻找与此处给出的相反的技巧,该技巧适用于将MATLAB输出转换回Python.

python matlab numpy

7
推荐指数
2
解决办法
1759
查看次数