2017-07-16 4 views
0

Il est facile d'obtenir la nième occurrence d'une instance dateutil.rrule.rrule:Python dateutil.rrule ignorer toutes les occurrences nième

rule = dateutil.rrule.rrule(...) 
occurrence = rule[15] 

... Mais j'ai un événement tel que occurrence in rule is True; Je voudrais savoir quelle occurrence il est (c'est-à-dire l'indice de l'occurrence, qui est 15 dans l'exemple ci-dessus) sans causer de problèmes de performance, car il se peut que je doive faire cela avec beaucoup d'occurrences. Est-ce possible, et si oui, comment cela serait-il fait?

Répondre

0

Je ne suis pas au courant d'une méthode qui vous permettrait d'exécuter un test sur les valeurs avec l'ensemble actuel des fonctions.

Toutefois, en fonction de la fréquence à laquelle vous effectuez vos calculs, vous pourriez envisager de faire ce qui suit:

  1. Utilisez les cache feature:
cache

- Si on leur donne, il doit être un booléen valeur spécifiant pour activer ou désactiver la mise en cache des résultats. Si vous utilisez plusieurs fois la même instance rrule , activer la mise en cache améliorera considérablement les performances .

  1. Remapper vos résultats sur un tableau numpy pour la résolution d'index optimal:

Compte tenu r étant un grand nombre de résultats:

>>> r # Your result set 
<dateutil.rrule.rrule object at 0x7f616d4182e8> 
>>> r[1] # Example of what's inside 
datetime.datetime(2015, 1, 1, 0, 0) 
>>> import numpy as np # Let's load numpy 
>>> a = np.array(list(r)) # We build a numpy array, should be fast 
>>> np.argwhere(a == datetime.datetime(2015, 1, 1, 0, 0)) # Catch'em all! 
array([[1]]) 

I Je ne sais pas si np.argwhere() sera plus rapide que l'itération sur le jeu de résultats avec une simple boucle, mais c'est une approche plus lisible.