Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cython:优化本机Python memoryview_Python_Cython_Memoryview_Typed Memory Views - Fatal编程技术网

Cython:优化本机Python memoryview

Cython:优化本机Python memoryview,python,cython,memoryview,typed-memory-views,Python,Cython,Memoryview,Typed Memory Views,我有一个函数(来自外部Python库),它返回一个我想在Cython中处理的memoryview对象 为了提高效率,有没有办法将其转换为字节类型的memoryview(无副本)?我该怎么做呢?这不起作用: mv = memoryview(b'1234') cdef char[:] *tmv tmv = mv ^ ------------------------------------------------------------ /home/me/.cache/ipython/cy

我有一个函数(来自外部Python库),它返回一个我想在Cython中处理的
memoryview
对象

为了提高效率,有没有办法将其转换为字节类型的memoryview(无副本)?我该怎么做呢?这不起作用:

mv = memoryview(b'1234')
cdef char[:] *tmv
tmv = mv
     ^
------------------------------------------------------------

/home/me/.cache/ipython/cython/_cython_magic_f9f608355444e2d6828580906623cea8.pyx:3:6: Cannot convert Python object to '__Pyx_memviewslice *'
由@Code外科医生链接是一种可能性。但是,自Cython 0.28以来,我们有了一种更为简洁的方式—键入的MemoryView:

%%cython
mv = memoryview(b'1234')
cdef const unsigned char[:] tmv=mv  #"const" is possible since Cython 0.28
显然,你只能从这个记忆视图中阅读(这是一件好事),而不涉及复制

你也可以说:但这是
无符号字符
,而不是
字符
!正确-这也是一件好事:
bytes
unsigned char
s和类型化内存视图的全部内容,您不会混淆类型

我认为链接解决方案有点危险的另一个原因是——你拥有C语言的全部力量,可以射中你自己的脚,因为它可以赶走类型和常量。例如,见:

%%cython    
def bad_things(a):
   cdef const unsigned char[:] safe=a
   cdef char *unsafe=<char *> &safe[0] #who needs const and types anyway?
   unsafe[0]=52   #replace through `4`
因为Python有一个小字符串池,这些字符串是不可变的(或者Python认为是不可变的),并且我们已经更改了
b'a'
链接到
b'4'
的对象,我们应该做好准备,以获得有趣的结果和愉快的调试


总的来说,这是一个不需要动脑筋的问题:坚持使用类型化的memoryview来保证类型和常量的安全性。

如果您还没有看到它,您可能会想看一看。而且,既然python memoryview是从bytearray创建的,为什么不直接将bytearray传递给cython呢?@code>mv=memoryview(b'1234'))表达式对我来说是不透明的,即
mv
实际上是第三方库函数的结果。
 >>> A=b'a'
 >>> bad_things(A)
 >>> print(A)   #take it Python - I pwned your immutability!
 b'4'
 >>> print(b'a')
 b'4'
 >>> #Help! What are you doing Python?