Mam obiekt bufora w C++, który dziedziczy po std::vector<char>
. Chcę przekonwertować ten bufor na ciąg znaków w języku Python, aby można go było wysłać przez sieć za pośrednictwem protokołu Twisted's protocol.transport.write.Szybkość kopiowania bufora w języku Python - dlaczego tablica jest wolniejsza od łańcucha?
dwojako myślałem w ten sposób są (1) podejmowania ciąg i wypełnienie go char przez char:
def scpychar(buf, n):
s = ''
for i in xrange(0, n):
s += buf[i]
return s
i (2) podejmowania tablicę char (ponieważ wiem, jak duże bufor jest) , wypełnienie go i przekształcenie go na ciąg
def scpyarr(buf, n):
a = array.array('c','0'*n)
for i in xrange(0, n):
a[i] = buf[i]
return a.tostring()
myślałem, że (1) musi zrobić nowy obiekt string za każdym razem s += buf[i]
nazywa i skopiuj zawartość starego łańcucha. Spodziewałem się więc (2), że jest szybszy niż (1). Ale jeśli przetestuję to używając timeit, stwierdzam, że (1) jest w rzeczywistości około dwa razy szybszy niż (2).
Zastanawiam się, czy ktoś może wyjaśnić, dlaczego (1) jest szybszy?
Punkty premiowe za jeszcze skuteczniejszy sposób konwersji z std::vector<char>
na ciąg znaków w języku Python.
Nie sądziłem, że join zaakceptuje wektor, ale tak jest. Chłodny! – Corey
ciekawe, czy masz referencje na temat modyfikacji w miejscu cpython w miejscu? –
@RyanHaining: Patrz uwaga 6 [tutaj] (http://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange). – user2357112