Python str视图

vz0*_*vz0 10 python memory python-2.x python-3.x

我有一个str大约1GB的长度:

>>> len(L)
1073741824
Run Code Online (Sandbox Code Playgroud)

我需要从特定索引中取出许多字符串,直到字符串结束.在C我会这样做:

char* L = ...;
char* p1 = L + start1;
char* p2 = L + start2;
...
Run Code Online (Sandbox Code Playgroud)

但在Python中,切片字符串会str使用更多内存创建一个新实例:

>>> id(L)
140613333131280
>>> p1 = L[10:]
>>> id(p1)
140612259385360
Run Code Online (Sandbox Code Playgroud)

为了节省内存,我如何创建一个类似str的对象,实际上是指向原始L的指针?

编辑:我们有buffermemoryview在Python 2和Python 3中,但memoryview没有展示与stror或相同的界面bytes:

>>> L = b"0" * 1000
>>> a = memoryview(L)
>>> b = memoryview(L)
>>> a < b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: memoryview() < memoryview()

>>> type(b'')
<class 'bytes'>
>>> b'' < b''
False
>>> b'0' < b'1'
True
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 6

有一种memoryview类型:

>>> v = memoryview('potato')
>>> v[2]
't'
>>> v[-1]
'o'
>>> v[1:4]
<memory at 0x7ff0876fb808>
>>> v[1:4].tobytes()
'ota'
Run Code Online (Sandbox Code Playgroud)

  • 也许应该将您的答案编辑为使用字节,以便它也可以在python 3中使用。要么这样做,要么从问题中删除3.x标记。 (2认同)