Поскольку cStringIO
не реализует интерфейс буфера, если его getvalue
возвращает копию данных, то нет способа получить его данные без копирования.
Если getvalue
возвращает буфер в виде строки без копирования, numpy.frombuffer(x.getvalue(), dtype='S1')
выдаст (только для чтения) пустой массив, ссылающийся на строку, без дополнительной копии.
Причина, по которой np.fromiter(c, int)
и np.array(c, int)
не работают, заключается в том, что cStringIO
при повторении возвращает строку за раз, аналогично файлам:
>>> list(iter(c))
['\x01\x00\x00\x00\x01\x00\x00\x00']
Такая длинная строка не может быть преобразована в одно целое число.
***
Лучше не слишком беспокоиться о том, чтобы делать копии, если это действительно не является проблемой. Причина в том, что дополнительные накладные расходы, например, использование генератора и передача его в numpy.fromiter
может быть на самом деле больше, чем то, что требуется при создании списка, а затем передача его в numpy.array
--- создание копий может быть дешевле по сравнению с накладными расходами времени выполнения Python.
Однако, если проблема связана с памятью, то одним из решений является помещение элементов непосредственно в окончательный массив Numpy. Если вы знаете размер заранее, вы можете предварительно выделить его. Если размер неизвестен, вы можете использовать метод .resize()
в массиве, чтобы увеличить его по мере необходимости.