Moyenne courante en Python
Est-il un pythonic façon de créer une liste qui contient un moyen d'une certaine fonction?
Après la lecture d'un amusant petit morceau d'environ Les martiens, des boîtes noires, et la Cauchy de distributionj'ai pensé qu'il serait amusant de calculer une moyenne de la distribution de Cauchy moi-même:
import math
import random
def cauchy(location, scale):
p = 0.0
while p == 0.0:
p = random.random()
return location + scale*math.tan(math.pi*(p - 0.5))
# is this next block of code a good way to populate running_avg?
sum = 0
count = 0
max = 10
running_avg = []
while count < max:
num = cauchy(3,1)
sum += num
count += 1
running_avg.append(sum/count)
print running_avg # or do something else with it, besides printing
Je pense que cette approche fonctionne, mais je suis curieux de savoir si il y a peut être un plus élégant à l'approche de la construction que running_avg
liste que d'utiliser des boucles et des compteurs (par exemple interprétations de la liste).
Il y a des questions connexes, mais ils traitent aussi des problèmes plus complexes (petite taille de la fenêtre, l'exponentielle de pondération) ou ne sont pas spécifiques à Python:
- calculer la moyenne mobile exponentielle en python
- La façon la plus efficace de calculer l'exécution d'un écart-type?
- Le calcul de la Moyenne mobile d'une Liste
source d'informationauteur Nate Kohl
Vous devez vous connecter pour publier un commentaire.
Vous pourriez écrire un générateur:
Ou un générateur de Cauchy de nombres et une fonction d'utilité pour une somme en cours d'exécution generator, vous pouvez avoir une maison propre générateur d'expression:
Vous pouvez utiliser coroutines. Ils sont semblables à des générateurs, mais vous permet d'envoyer des valeurs. Coroutines a été ajouté dans Python 2.5, donc cela ne fonctionnera pas dans les versions d'avant.
Comme une compréhension de liste:
Modifications:
next()
fonction de la place de lait.next()
méthode. Il en est ainsi, il sera également travailler avec Python 3. Lenext()
fonction a également été porté à la version 2.6 de Python+.Dans Python 2.5, vous pouvez soit remplacer les appels à
it.next()
, ou de définir unnext
fonction de vous-même.(Merci Adam Parkin)
J'ai deux solutions possibles ici pour vous. Les deux sont tout simplement génériques moyen de fonctions qui fonctionnent sur une liste de nombres. (peut-être faite pour fonctionner avec n'importe quel itérable)
Générateur de fonction:
Liste de Compréhension de base (vraiment le même code que précédemment):
Générateur-compatabile Générateur de fonction:
Modifier: Ce que je viens de tester pour voir si je pouvais faire ma solution compatible avec les générateurs facilement et ce qu'il serait. C'est ce que je suis venu avec.
Voir les statistiques ci-dessous, en vaut la peine.
Caractéristiques de Performance:
Modifier: j'ai aussi décidé de tester Orip est intéressant d'utiliser de multiples générateurs de voir l'impact sur les performances.
À l'aide de timeit et la suivante (1 000 000 d'itérations 3 fois):
J'obtiens les résultats suivants:
Voir les commentaires de code:
Résultats sont en quelques secondes, et de montrer l'
LCnouveau générateur compatible générateur de méthode pour être toujours plus vite, vos résultats peuvent varier. J'attends de la différence énorme entre mon générateur original et le nouveau est le fait que la somme n'est pas calculé à la volée.