4
votes

La portée de la variable est modifiée dans des cellules consécutives en utilisant %% time dans le notebook Jupyter

Je suis confronté à un problème étrange (ou il me manque quelque chose de basique). J'ai un notebook Jupyter et dans une cellule il y a une variable enregistrée sous numpy.ndarray , mais lorsque j'imprime son type dans la cellule suivante, la variable apparaît comme du type list code >. Comment est-ce possible? Dans ma machine fonctionne bien, dans une VM ne fonctionne pas.


Description détaillée:

Je travaille sur un certain pull request mettre à jour un notebook jupyter, et comme j'ai des problèmes de traçage dans ma configuration actuelle, j'ai essayé de tester il dans une machine / système différent avec des packages et des composants mis à jour.

Dans mon ordinateur portable, j'ai Ubuntu 16.04 et cette configuration:

> The version of the notebook server is: 5.7.6 The server is running on
> this version of Python: Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
> [GCC 8.2.0]
> 
> Current Kernel Information: Python 3.6.7 (default, Oct 22 2018, 11:32:17)
> IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.

J'ai créé un virtuel machine, installé Ubuntu 18.04 et utiliser cette configuration:

> The version of the notebook server is: 5.7.4 The server is running on
> this version of Python: Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
> [GCC 5.4.0 20160609]
> 
> Current Kernel Information: Python 3.5.2 (default, Nov 12 2018,
> 13:43:14)
> IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

Ensuite, j'ai identifié que dans la VM, une variable change son type de numpy.ndarray à list sans raison (pour moi). La variable est pos . Cela me pose des problèmes car il est utilisé plus tard à des fins d'indexation

Ordinateur portable:

 Laptop

Machine virtuelle: vm

Que se passe-t-il ici? Est-ce que je manque quelque chose à ce sujet?

Tout indice est apprécié :) Merci.


MISE À JOUR:

Je ' J'ai essayé un autre notebook dans la VM, et maintenant ce n'est pas seulement le type qui change, mais la variable non atteinte dans une cellule différente (variable joint_vars):

 entrez la description de l'image ici

Doit-il s'agir d'une mauvaise configuration de l'environnement de la VM?


6 commentaires

Êtes-vous sûr d'avoir exécuté toutes les cellules dans un ordre séquentiel? En regardant votre première cellule dans les deux captures d'écran, vous avez imprimé le type et il affiche numpy.ndarray dans les deux cas.


C'est la chose étrange ... lorsque j'imprime le type dans la cellule à laquelle la variable est attribuée, le type est OK. mais quand je continue avec les cellules suivantes, cela me donne le type list dans la VM


@ Scratch'N'Purr, j'ai mis à jour l'article avec un comportement nouveau bizarre : la variable n'est pas atteinte dans la cellule suivante (?)


C'est vraiment étrange. Je me demande si cela a quelque chose à voir avec %% time . Essayez de supprimer cette ligne?


vous l'avez ... J'ai supprimé %% time des deux cas et ils ont fonctionné. Dans le premier cas, le type de variable est ok, et dans le second cas, la variable existe dans la cellule suivante ... Une idée de pourquoi cela se produit?


Je ne suis pas trop sûr mais je suppose que la fonction magique expose uniquement les variables à l'intérieur de la cellule elle-même. Après tout, le %% indique la magie de cellule . Si vous souhaitez obtenir les temps d'exécution de chaque cellule, Jupyter a un extension pour cela.


3 Réponses :


6
votes

Je pense que le problème ici est un changement dans la façon dont la portée est gérée dans la magie cellulaire. Votre ordinateur portable exécutait IPython 7.2.0; votre VM exécute la version 7.4.0. L'ancien comportement a changé dans la version 7.4.0 (cela peut être un bogue à corriger dans une prochaine version).

Je soupçonne que pos avait été précédemment défini comme une liste dans votre notebook. Dans 7.4.0 (comme sur votre VM), tout ce qui se trouve dans la cellule est traité comme une portée locale. Par exemple:

In [4]: foo
Out[4]: 5

Si vous exécutez la même chose avec la version 7.3.0, vous vous retrouvez avec

Python 3.7.2 | packaged by conda-forge | (default, Mar 19 2019, 20:46:22)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: foo = "bar"

In [2]: foo
Out[2]: 'bar'

In [3]: %%time
   ...: foo = 5
   ...:
   ...:
CPU times: user 3 µs, sys: 1 µs, total: 4 µs
Wall time: 5.72 µs

In [4]: foo
Out[4]: 'bar'

Depuis foo a été défini comme une chaîne précédemment, l'effet que vous observez est que le type de foo (à partir de la cellule 4) change en fonction de la version d'IPython. (Ici, ce qui devrait être un entier se transforme en chaîne.) Ceci est plus subtil lorsque les types impliqués sont étroitement liés, comme les listes et les tableaux numpy dans votre cas. Ce n'est pas que le type a changé à cause de la cellule; c'est que la nouvelle valeur n'a jamais été attribuée, elle a donc conservé son ancien type.

La solution est de rétrograder la VM vers IPython 7.3.0 pour le moment, ou d'éviter d'utiliser le %% time magie cellulaire.


2 commentaires

Merci pour votre réponse.


c'est une des raisons pour ne pas utiliser jupyter



2
votes

Pour contourner le problème pour l'instant, vous pouvez explicitement mettre une instruction global dans la cellule %% time , afin que les autres cellules puissent voir la variable.

pré> XXX


1 commentaires

Cela a fonctionné dans mon scénario, lorsque la variable (modin dataframe) n'était pas du tout définie dans les cellules suivantes.



0
votes

Vous pouvez également essayer de redémarrer et d'exécuter toute la cellule, comme vous le feriez en exécutant python à partir de la CLI.


0 commentaires