Чтобы понять, почему ваш код не работает, добавьте несколько строк для печати нескольких адресов.
short* ptr1 = (short*)(people + sizeof(Person::name));
short* ptr2 = &(people[0].birthMonth);
std::cout << "ptr1: " << ptr1 << ", ptr2: " << ptr2 << std::endl;
Вы заметите, что из-за требований к выравниванию ptr1
и ptr2
.
Дальнейшее чтение: https://en.wikipedia.org/wiki/Data_structure_alignment .
Вы ищете итерации по декартовому произведению.
Вот способ перебрать декартову.
from itertools import product
import numpy as np
L1=np.linspace(1, 2, 2)
M5=np.linspace(16, 17, 2)
dconf = dict(data=5)
size = L1.size
loop_size = size**2
def propagate(N, data, modifiers):
data.update(modifiers)
out = []
for i in range(N):
out.append('%s : %s : %s : %s'%(i, *data.values()))
return out
mod = (dict(L1=i, M5=j) for i, j in product(L1, M5))
m = map(propagate, np.arange(2, 2+loop_size), (dconf,)*loop_size, mod)
for outer in m:
for inner in outer:
print(inner)
Это вы можете адаптировать к своему коду, и если вам действительно нужно идти параллельно (со всем, что это означает с точки зрения разделения информации между ядрами), возможно, посмотрите на Dask.
Надеюсь, этого достаточно, чтобы вы пошли.
Редактировать: ваш вопрос довольно сложно определить. Ваш вопрос действительно, как просто выполнить простой «вызов функции»? Полагаю, один из ответов - просто создать функцию обтекания, что-то вроде ...
def propagate(N, data, modifiers):
...
def call_propagate(N, data, L1_, M5_):
mod = ...
m = map(...
return m
for outer in call_propagate(1000, dconf, L1, M5)
for inner in outer:
print(inner)
Я думаю, что меня как-то заблокировали ... Я продолжал думать, как сохранить имя переменной (например, L1
) и передать его как переменную другой функции.
@ forward87: Ваше первое предложение уже разблокировало меня, и я понял, что **data
можно обработать просто через словарь. Итак, в конце концов, мне просто нужно было преобразовать входной dict в список dicts для следующей функции, например, так (с некоторыми несущественными частями, отсекаемыми):
def propagate_parallel(RTs, cav_data, **ddata):
keys = list(ddata.keys())
values = list(ddata.values())
futures = []
res = []
with confu.ProcessPoolExecutor(max_workers=32) as pool:
for i in it.product(*values):
futures.append(pool.submit(propagate, RTs=RTs,
cav_data=cav_data,
**dict(zip(keys, list(i)))))
for fut in futures:
res.append(fut)
return res
Я, наконец, понимаю **kwargs
, и что это может быть как диктат. Спасибо!