Je suis en train d'utiliser IPython parallèles de l'environnement et pour l'instant, il a l'air super mais je suis confronté à un problème. Disons que j'ai une fonction, définie dans une bibliothèque
def func(a,b):
...
que j'utilise quand je veux évaluer sur une valeur de un et un tas de valeurs de b.
[func(myA, b) for b in myLongList]
De toute évidence, la fonction réelle est plus compliquée, mais l'essence de la matière est qu'elle prend plusieurs paramètres et j'aimerais carte sur un seul d'entre eux. Le problème est que la carte, @dview.en parallèle, etc. carte plus de tous les arguments.
Donc disons que je veux obtenir la réponse à la touche func(myA, myLongList). Le moyen le plus évident pour ce faire est de curry, soit w/ functools.partielle ou juste comme
dview.map_sync(lambda b: func(myA, b), myLongList)
Toutefois, cela ne fonctionne pas correctement sur des machines distantes. La raison en est que, lorsque l'expression lambda est décapé, la valeur de myA n'est pas compris et au lieu de cela, la valeur de myA de l'étendue locale sur l'ordinateur distant est utilisé. Lors de fermetures d'obtenir marinés, les variables de fermer plus de ne pas.
Deux façons que je peux penser de ce qui sera effectivement le travail sont à construire manuellement des listes pour chaque argument et avoir une carte de travail de plus de tous les arguments,
dview.map_sync(func, [myA]*len(myLongList), myLongList)
ou de terrifiant utiliser les données par défaut des arguments à une fonction, en l'obligeant à obtenir marinés:
# Can't use a lambda here b/c lambdas don't use default arguments :(
def parallelFunc(b, myA = myA):
return func(myA, b)
dview.map_sync(parallelFunc, myLongList)
Vraiment, tout cela semble horriblement tordu lorsque la fonction réelle prend beaucoup de paramètres, et plus compliqué. Est-il un idiomatiques façon de faire cela? Quelque chose comme
@parallel(mapOver='b')
def bigLongFn(a, b):
...
mais autant que je sache, rien de tel que le " mapOver chose existe. J'ai probablement une idée de comment le mettre en œuvre ... cela se sent juste comme un très fonctionnement de base qu'il doit exister un soutien pour si je veux vérifier si je suis en manque de quelque chose.