2011-06-17 7 views
2

Je tente de diffuser un module à d'autres processus python avec MPI. Bien sûr, un module lui-même n'est pas pickleable, mais le __dict__ est. Actuellement, je décapage le __dict__ et fait un nouveau module dans le processus de réception. Cela a fonctionné parfaitement avec certains modules simples et personnalisés. Cependant, quand j'essaye de faire ceci avec NumPy, il y a une chose que je ne peux pas prendre facilement: le ufunc.Aider à décaper un ufunc?

J'ai lu ce fil qui suggère décaper la __name__ et __module__ du ufunc, mais il semble qu'ils se fondent sur numpy avoir entièrement construit et présente avant la reconstruire. Je dois éviter d'utiliser l'instruction import dans le processus de réception, donc je suis curieux de savoir si l'instruction getattr(numpy,name) mentionnée fonctionnerait avec un module qui n'a pas encore ufunc inclus.

En outre, je ne vois pas un attribut __module__ sur la ufunc dans la documentation NumPy: http://docs.scipy.org/doc/numpy/reference/ufuncs.html

Toute aide ou suggestion, s'il vous plaît?

EDIT: Désolé, j'ai oublié d'inclure le fil mentionné ci-dessus. http://mail.scipy.org/pipermail/numpy-discussion/2007-January/025778.html

Répondre

3

La décoction d'une fonction dans Python ne sérialise que son nom et le module dont elle provient. Il ne transporte pas de code sur le fil, donc lorsque vous décuplez vous devez avoir les mêmes bibliothèques disponibles que lors du décapage. Lors du démontage, Python importe simplement le module en question et saisit les éléments via getattr. (Ceci n'est pas limité à Numpy, mais s'applique au décapage en général.)

Les Ufunc ne décapent pas proprement, ce qui est une verrue. Vos options sont principalement de choisir seulement le __name__ (et peut-être le __class__) de l'ufunc, et de les reconstruire plus tard manuellement. (Ils ne sont pas réellement des fonctions Python et n'ont pas d'attribut __module__.)

+0

Les processus de réception n'importent réellement rien parce que je ne fais que décoder le '__dict__' d'un module via la fonction' bcast' dans MPI (' mpi4py'). Et puis je crée un module vide dans lequel j'insère le '__dict__'. Je vais le faire fonctionner avec mon interprète de débogage pour voir s'il importe vraiment quelque chose comme vous le suggérez. Le but de ce que j'essaie de faire est d'essayer d'empêcher les processus de réception d'avoir à accéder au système de fichiers tout en important le module. – Tim

+2

Les importations se produisent dans 'pickle.load', que mpi4py appelle - ce que vous n'avez pas le contrôle. (Si vous êtes intéressé, vous pouvez vérifier comment fonctionne le décapage: http://hg.python.org/cpython/file/tip/Lib/pickle.py#l1067 ou simplement vérifier le flux de pickle) Si vous voulez passer le code sur le fil contournant le système de fichiers, c'est possible (mais peut-être vous devriez déposer une question distincte pour cela ici) - soit passer le code Python comme dans une chaîne et le compiler avec exec de l'autre côté, soit compiler à un objet de code et le transmettre. Cependant, vous ne pouvez pas copier Numpy comme ceci. –