Mam ogromny str
o długości ~ 1GB:Widok Pythona str
>>> len(L)
1073741824
muszę przybierać różne kawałki sznurka od konkretnych indeksów do końca łańcucha. W C zrobiłbym:
char* L = ...;
char* p1 = L + start1;
char* p2 = L + start2;
...
Ale w Pythonie, krojenie ciąg tworzy nową instancję str
używając więcej pamięci:
>>> id(L)
140613333131280
>>> p1 = L[10:]
>>> id(p1)
140612259385360
Aby zaoszczędzić pamięć, w jaki sposób utworzyć obiekt STR-like to jest w rzeczywistości wskaźnik do oryginalnego L?
Edit: mamy buffer
i memoryview
w Pythonie 2 i Python 3, ale memoryview
nie wykazują ten sam interfejs jako str
lub 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
nie można po prostu zrobić 'id (L [10:])' zamiast tworzenia nowej zmiennej? – HarryCBurn
@Iplodman Wciąż tworzy nowy plaster, używając pamięci, a następnie odrzuca tymczasowy kawałek. – vz0
Python ma typ bufora, patrz http://stackoverflow.com/questions/3422685/what-is-python-buffer-type-for – gabber