В python можно совместно использовать объекты ctypes между несколькими процессами. Однако я замечаю, что выделение этих объектов кажется чрезвычайно дорогостоящим.
Рассмотрим следующий код:
from multiprocessing import sharedctypes as sct
import ctypes as ct
import numpy as np
n = 100000
l = np.random.randint(0, 10, size=n)
def foo1():
sh = sct.RawArray(ct.c_int, l)
return sh
def foo2():
sh = sct.RawArray(ct.c_int, len(l))
sh[:] = l
return sh
%timeit foo1()
%timeit foo2()
sh1 = foo1()
sh2 = foo2()
for i in range(n):
assert sh1[i] == sh2[i]
Вывод:
10 loops, best of 3: 30.4 ms per loop
100 loops, best of 3: 9.65 ms per loop
Есть две вещи, которые меня озадачивают:
- Почему явное распределение и инициализация по сравнению с передачей массива numpy намного быстрее?
- Почему распределение общей памяти в python так дорого?
%timeit np.arange(n)
принимает только46.4 µs
. Между этими таймингами существует несколько порядков.