Angesichts einer Anzahl von Spielern n
, muss ich H
finden, die Liste aller Tupel, wo jedes Tupel eine Kombination von Koalitionen ist (der Spieler, zB (1,2,3) ist die Koalition der Spieler 1, 2 und 3. ((1,2,3), (4,5), (6,)) ist eine Kombination von Koalitionen - die auch Tupel sind), die diese Regel respektieren: Jeder Spieler erscheint nur und genau einmal (dh in nur einem Koalition). P.S. Jede Kombination von Koalitionen wird Layout im Code genannt.Warum ist mein Code in pypy langsamer als der Standard-Python-Interpreter?
Am Anfang habe ich einen Ausschnitt geschrieben, in dem ich alle Kombinationen aller Koalitionen berechnet habe und für jede Kombination die Regel überprüft habe. Problem ist, dass für 5-6 Spieler die Anzahl der Kombinationen von Koalitionen bereits so groß war, dass mein Computer pleite ging. Um ein einen großen Teil der Berechnung (alle möglichen Kombinationen, die Schleife und die ifs) zu vermeiden, schrieb ich folgendes (die ich getestet und es ist äquivalent zu dem vorherigen Snippet):
from itertools import combinations, combinations_with_replacement, product, permutations
players = range(1,n+1)
coalitions = [[coal for coal in list(combinations(players,length))] for length in players]
H = [tuple(coalitions[0]),(coalitions[-1][0],)]
combs = [comb for length in xrange(2,n) for comb in combinations_with_replacement(players,length) if sum(comb) == n]
perms = list(permutations(players))
layouts = set(frozenset(frozenset(perm[i:i+x]) for (i,x) in zip([0]+[sum(comb[:y]) for y in xrange(1,len(comb))],comb)) for comb in combs for perm in perms)
H.extend(tuple(tuple(tuple(coal) for coal in layout) for layout in layouts))
print H
ERKLÄRUNG: sagen n = 3
Zunächst erstelle ich alle möglichen Koalitionen:
coalitions = [[(1,),(2,),(3,)],[(1,2),(1,3),(2,3)],[(1,2,3)]]
Dann initialisieren I H mit den offensichtlichen Kombinationen: jeden Spieler in seiner eigenen Koalition und jeden Spieler in der größten Koalition.
H = [((1,),(2,),(3,)),((1,2,3),)]
Dann berechnen ich alle möglichen Formen der Layouts:
combs = [(1,2)] #(1,2) represents a layout in which there is
#one 1-player coalition and one 2-player coalition.
ich berechnen die Permutationen (perms). Schließlich berechne ich für jede Dauerwelle und für jeden Kamm die verschiedenen möglichen Layouts. Ich set
das Ergebnis (layouts
), um Duplikate zu löschen und
H = [((1,),(2,),(3,)),((1,2,3),),((1,2),(3,)),((1,3),(2,)),((2,3),(1,))]
Hier ist der Vergleich zu H. hinzufügen:
python script.py
- 4: 0,000520944595337 Sekunden
- 5: 0,18219 Sekunden
- 6: 0.0408189296722 Sekunden
- 7: 0,431486845016 Sekunden lang
- 8: 6,05224680901 Sekunden lang
- 9: 76,4520540237 Sekunden lang
pypy script.py
- 4: 0,00342392921448 Sekunden lang
- 5: 0,0668039321899 Sekunden lang
- 6: 0,311077833176 Sekunden
- 7 : 1.13124799728 Sekunden
- 8: 11.5973010063 Sekunden
- 9: ging phut
Warum ist PyPy dass langsamer? Was soll ich ändern?
Regelmäßige Iertools könnten schneller kompilierten Code verwenden. – hpaulj
Es tut mir leid, was meinst du mit regulären? – Pigna
Ihr Standardinterpreter – hpaulj