Вот небольшой бенчмаркинга код, чтобы проиллюстрировать мой вопрос:Почему задания multiprocessing.sharedctypes настолько медленны?
import numpy as np
import multiprocessing as mp
# allocate memory
%time temp = mp.RawArray(np.ctypeslib.ctypes.c_uint16, int(1e8))
Wall time: 46.8 ms
# assign memory, very slow
%time temp[:] = np.arange(1e8, dtype = np.uint16)
Wall time: 10.3 s
# equivalent numpy assignment, 100X faster
%time a = np.arange(1e8, dtype = np.uint16)
Wall time: 111 ms
В основном я хочу NumPy массив, который будет разделен между несколькими процессами, потому что это большой и только для чтения. This method отлично работает, никаких дополнительных копий не производится, и фактическое время вычислений на процессах хорошее. Но накладные расходы , создавая, разделяемый массив огромен.
This postThis post Предлагаем некоторое представление о том, почему некоторые способы инициализации массива медленны (обратите внимание, что в приведенном выше примере я использую более быстрый метод). Но сообщение не описывает, как действительно повысить скорость до нулевой производительности.
Есть ли у кого-нибудь предложения по улучшению скорости? Может ли какой-нибудь код на Cython выделить массив?
Я работаю над системой Windows 7 x64.
Обратите внимание, что при выполнении «сырых» копий данных размеры элементов должны совпадать; Если они этого не сделают, вы получите 'TypeError' из' memoryview', жалующийся на «несоответствующие размеры элементов»; если объекты не могут быть созданы с соответствующими размерами для запуска, обычно довольно дешево конвертировать между различными типами массивов 'numpy', поэтому в 64-битной системе, если' temp' был сделан из 'ctypes.uint' (4 байта на большинство систем), и у вас был массив 'numpy' типа' np.uint' для назначения (8 байтов на 64 бит), вы могли бы просто использовать 'memoryview (temp) [:] = np.array (toobigarray, dtype = np .uint32) 'для преобразования сначала, а затем' memcpy'. – ShadowRanger
Удивительный, спасибо! Одна из проблем, с которыми я сталкиваюсь, заключается в том, что при попытке этого метода возникает ошибка: 'NotImplementedError: memoryview: неподдерживаемый формат
@DavidHoffman: Похоже, что на Python 3 'memoryview' походит на' temp', явно ограниченный порядком байтов ('!') == memoryview (np.arange (dtype = np.uint16)) .format.lstrip ('@ = <>!') ', чтобы быть уверенным. –
ShadowRanger