Le temps de la complexité de l'accès à un Python dict

Je suis en train d'écrire un simple programme en Python.

Mon programme semble souffrir de linéaire de l'accès à des dictionnaires,
son exécution se développe de façon exponentielle, même si l'algorithme est quadratique.

J'utilise un dictionnaire pour memoize valeurs. Ce qui semble être un goulot d'étranglement.

Les valeurs que je suis de hachage sont des n-uplets de points.
Chaque point est: (x,y), 0 <= x,y <= 50

Chaque clé dans le dictionnaire est: Un n-uplet de 2 à 5 points: ((x1,y1),(x2,y2),(x3,y3),(x4,y4))

Les touches sont lu de nombreuses fois plus souvent qu'ils sont écrits.

Suis-je correct que python dicts souffrent de linéaire temps d'accès à de telles données?

Autant que je sache, les jeux ont garanti logarithmique temps d'accès.

Comment puis-je simuler des dicts à l'aide des ensembles(ou quelque chose de similaire) en Python?

modifier conformément à la demande de plusieurs, voici un (simplifié) de la version de la memoization fonction:

def memoize(fun):
    memoized = {}
    def memo(*args):
        key = args
        if not key in memoized:
            memoized[key] = fun(*args)
        return memoized[key]
    return memo
  • Quelles preuves avez-vous pour cela? Pouvez-vous fournir votre rendement réel des chiffres? Profil de résultats? Vous êtes probablement à la recherche dans le mauvais endroit pour votre problème. Merci donc de documenter votre problème avant de faire des suppositions quant à la cause.
  • Je lance le tout à travers le python profiler. Le memoization fonction prend de façon exponentielle plus même si il y a polynomialement différentes entrées qu'elle peut prendre. Je vais poster profileur de données si vous le souhaitez.
  • Pouvez-vous nous un exemple de code pour le memoization fonction? Vous pouvez aussi essayer d'écrire un test rapide d'application, générant une charge de hachages pour vos données et en comptant le nombre de collisions (il ne devrait pas prendre de temps en fonction de la façon dont les hachages en python travail)
  • I. e. avec O(N**5) entrées il prend 2 secondes avec N = 8 et 4 secondes avec N = 9.
  • Je sais ce que l'exponentielle est, merci. Cependant, les dictionnaires en général il suffit de ne pas se comporter comme ça. Nous avons pu voir un exemple de code ici, afin que nous puissions voir ce que vous êtes en train de faire différemment de provoquer un tel comportement étrange.
  • Veuillez coller le réel memoization fonction, pas une version simplifiée. Vous pouvez avoir caché le bug lors de la simplification.
  • -1 pour poser une question sans réponse. Un jeu de données de test sur le long avec complet profilable code (avec le profilage des résultats) serait nécessaire.
  • -1 pour poser une question sans suffisamment d'informations pour évaluer correctement le problème, et puis ce qui suggère que d'autres demandent plus d'informations sont "impoli". Vous êtes le seul à demander de l'aide, quand les gens offrent à vous aider à demander pour plus de renseignements, ils ne sont pas "impoli", mais vous êtes certainement impoli pour faire ce genre de ad hominem affirmation. De toute évidence, vous ne savez pas toutes les informations nécessaires pour répondre à la question que vous nous avez fournis, ou vous avez déjà répondu pour vous-même.

InformationsquelleAutor x10 | 2009-12-26