Tôi có một đối tượng đệm trong C++ kế thừa từ std::vector<char>
. Tôi muốn chuyển đổi bộ đệm này thành một chuỗi Python để tôi có thể gửi nó qua mạng thông qua giao thức protocol.transport.write của Twisted.Tốc độ sao chép bộ đệm Python - tại sao mảng chậm hơn chuỗi?
Hai cách tôi nghĩ để làm điều này là (1) thực hiện một chuỗi và điền nó char bởi char:
def scpychar(buf, n):
s = ''
for i in xrange(0, n):
s += buf[i]
return s
và (2) thực hiện một mảng char (kể từ khi tôi biết làm thế nào lớn bộ đệm là) , điền nó và chuyển đổi nó thành một chuỗi
def scpyarr(buf, n):
a = array.array('c','0'*n)
for i in xrange(0, n):
a[i] = buf[i]
return a.tostring()
tôi đã có thể nghĩ rằng (1) có để làm cho một đối tượng chuỗi mới mỗi khi s += buf[i]
được gọi, và sao chép nội dung của chuỗi cũ. Vì vậy, tôi đã mong đợi (2) để được nhanh hơn (1). Nhưng nếu tôi kiểm tra điều này bằng cách sử dụng timeit, tôi thấy rằng (1) thực sự là nhanh gấp đôi (2).
Tôi đã tự hỏi liệu có ai đó có thể giải thích tại sao (1) nhanh hơn không?
Điểm thưởng cho một cách hiệu quả hơn để chuyển đổi từ std::vector<char>
thành chuỗi Python.
Tôi không nghĩ rằng tham gia sẽ chấp nhận các vector, nhưng nó. Mát mẻ! – Corey
thú vị, bạn có tham khảo về sửa đổi tại chỗ cpython không? –
@RyanHaining: Xem chú thích 6 [ở đây] (http://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange). – user2357112