update
Оказывается, кодек Python utf-8 можно использовать для непосредственного декодирования ndarray, без необходимости копировать его содержимое в строку байтов с помощью .tostring()
: сначала с помощьюМодуль кодеков позволяет извлекать вызываемый файл, который охватывает последовательности байтов utf-8, в строки Unicode без необходимости проходить через str.decode
lst = [np.frombuffer(b'asd', dtype = np.uint8), np.frombuffer(b'asdasdas', dtype = np.uint8)]
import codecs
decoder = codes.getdecoder("utf-8")
data = np.array([decoder(item)[0] for item in lst], dtype="unicode")
Это позволяет избежать одного шага преобразования - есть еще один шаг, которыйможно было бы избежать, потому что это все равно создаст список всех строк в памяти перед вызовом последнего конструктора .array
- numpy имеет конструктор массива .fromiter
- но он не может создать массив с произвольными объектами Unicode - ему нуженфиксированная ширина символа.Это потребовало бы больше памяти, чем вы сейчас:
data = np.fromiter((decoder(item) for item in lst), count=len(lst), dtype="U120") # For max-length of 120 characters.
оригинал-ответ (главным образом Рим),
Современная Python внутренняя обработка текста Unicode - этодовольно эффективный, с внутренним представлением точек Unicode, зависящим от самого широкого символа в строке.
Numpy, с другой стороны, просто хранит 32-битное значение для каждого символа Unicode - и у него нет делового "понимания" utf-8.Язык Python делает это очень хорошо - и это быстро.Хотя Python не будет использовать многопоточные, многоядерные или аппаратно-ускоренные стратегии при декодировании байтов utf-8 в текст, декодирование происходит в собственном коде и выполняется так же быстро, как и в одном ядре ЦП.
Декодирование текста размером 4 МБ в Unicode с использованием простого Python заняло менее 30 мс в моей системе.
Другими словами: вас беспокоит не та проблема - если только то, что вы кодируете, не нуждается в устойчивом преобразовании примерно 100-битного текстового корпуса в секунду.
Просто позвольте Python выполнить декодирование utf-8 и обработать результат обратно в numpy (который снова закодирует его в 32-битном формате) - тратится на это столь незначительно для подавляющего большинства реальныхВ мире задач, например, библиотека Pandas выполняет практически все свои действия с данными: создает новые копии после каждой операции.