Numpy Fonctions Pures pour la performance, la mise en cache

Je suis en train d'écrire quelques modérément critique pour les performances du code de numpy.
Ce code sera à l'intérieur de la plupart de boucle, d'un calcul que la course du temps est mesurée en heures.
Un rapide calcul suggèrent que ce code sera exécuté jusqu'à quelque chose comme 10^12 fois, dans certaines variantes du calcul.

Donc la fonction est de calculer sigmoïde(X) et une autre pour calculer sa dérivée (gradient).
Sigmoïde a la propriété que pour
y=sigmoïde(x), dy/dx= y(1-y)
En python pour numpy cela ressemble à:

sigmoid = vectorize(lambda(x): 1.0/(1.0+exp(-x)))
grad_sigmoid = vectorize(lambda (x): sigmoid(x)*(1-sigmoid(x)))

Comme on peut le voir, les deux fonctions sont de pures (sans effets secondaires),
donc, ils sont des candidats idéaux pour memoization,
au moins pour le court terme, j'ai quelques inquiétudes sur la mise en cache chaque appel à sigmoïde jamais fait: Stockage de 10^12 flotteurs qui prendrait plusieurs téra-octets de RAM.

Est-il un bon moyen d'optimiser ce?
Va python ramasser que ce sont des pures fonctions et les mettre en cache pour moi, comme il convient?
Suis-je à vous soucier de rien?

Notez que 1/(1+np.exp(-x)) accepte d'ores et déjà numpy des tableaux d'entrée et il est vraiment rapide (j'imagine memoization ne va pas aider du tout). En utilisant vectorize, vous êtes le rendant beaucoup plus lent, mais, depuis qu'il est mis en œuvre à l'aide de slow pour les boucles.
Quelle est la taille de x?
varie, mais j'ai pris pour ma règle de tumb calculs, x est le plus souvent un vecteur de longueur 100.

OriginalL'auteur Lyndon White | 2014-01-14