2017-10-27 4 views
-1
def getLCM(a, b): 
    c, d = max(a, b), min(a, b) 
    while c != d: 
     temp = c - d 
     c, d = max(temp, d), min(temp, d) 

    return a * b // c 


def nlcm(num): 
    temp = 1 
    while len(num) != 0: 
     temp = getLCM(temp, num[-1]) 
     num.pop() 
    return temp 

print(nlcm([2,6,8,14,5])); 

Ich muss "schnell" bekommen dieses Problem zu beantworten. im Testfall ist mein Code sehr langsam.Wie bekomme ich schnell Antwort von LCM von Python

+4

Couldn‘ t Sie finden etwas anderes in diesem 0.023 Sekunden, die es dauerte, um das Programm zu starten? Vielleicht schnappst du dir einen Kaffee oder spielst mit den Kindern :-) – paxdiablo

+1

Ich bekomme sofort eine Antwort auf meine Maschine. Hast du Timing in Millisekunden? – 0TTT0

+0

Vielleicht ist die Nummer von num groß, mein Code ist langsam. Also muss ich schnell meinen Code bekommen –

Antwort

1

Es gibt bestehende gcd Implementierungen in Python, und LCM ist in Bezug auf gcd definierbar, so dass Sie genauso gut vermeiden können, das Rad neu zu erfinden. Im Einzelnen:

ggT (a, b) x LCM (a, b) = a × b

mit Python 3.5 und höher, wird eine beschleunigte gcd Funktion auf dem math Modul, so lcm kann vereinfacht zu:

from math import gcd 

def getLCM(a, b): 
    return a * b // gcd(a, b) 

auf älteren Python, ist es nicht beschleunigt, sondern fractions.gcd ist eine anständige Implementierung für Sie zur Verfügung gestellt, so dass Sie es stattdessen verwenden können, oder die bestmöglichenzu verwendenauf, was Version Sie laufen auf einem verschachtelten Importversuch funktioniert:

try: 
    from math import gcd 
except ImportError: 
    from fractions import gcd 

Ihre nlcm Schleife auch vereinfacht werden: Sie müssen manuell, nur Schleife nicht destruktiv iterieren:

def nlcm(num): 
    temp = 1 
    for x in num: 
     temp = getLCM(temp, x) 
    return temp 

Or wenn Sie bekommen klug, verwenden Sie reduce (functools.reduce auf Python 3.x), da es tut genau das, was das vereinfachte Schleife bereits tut:

from functools import reduce 

def nlcm(nums): 
    return reduce(getLCM, nums, 1) 
+0

Danke für deine Antwort. Dank dir weiß ich über die "Reduzierung". Aber in meiner Lernklasse kann ich die Funktion 'gcd' nicht verwenden. –

+0

@ 전현근: Nun, Sie können 'fractions.gcd' immer noch als bessere Implementierung verwenden, da [der Code dafür ist reines Python] (https://github.com/python/cpython/blob/3.4/Lib/fractions .py # L17) und kann buchstäblich kopiert werden; vergewissere dich, dass du es verstehst. ;-) – ShadowRanger

0

die „lange Ausführung“ Unter der Annahme, ist nicht in dem Beispiel, das Sie zur Verfügung gestellt, sondern mit größeren Eingängen können Sie memoization und increate die Zeit getLCM() im Fall berechnet wird es genannt wieder mit den gleichen Zahlen addieren:

hash = dict() # we'll save here the calculated results 

def getLCM(a, b): 
    global hash 
    if (a, b) in hash: # if it was already calculated 
     return hash[(a, b)] # use the cached result 
    c, d = max(a, b), min(a, b) 
    while c != d: 
     temp = c - d 
     c, d = max(temp, d), min(temp, d) 

    hash[(a, b)] = a * b // c. # cash the result 
    return a * b // c 
+0

Hinweis: Wenn Sie auf Python 3.2 oder höher sind, kann Ihnen ['functools.lru_cache'] (https://docs.python.org/3/library/functools.html#functools.lru_cache) dies geben Caching-Verhalten als Dekorator auf der ursprünglichen (nicht zwischengespeicherten) Funktion, wobei die Hässlichkeit des Mischens der Caching-Logik mit der Berechnungslogik vermieden wird. – ShadowRanger

+0

Richtig, obwohl Sie berücksichtigen müssen, dass dieses Caching ... LRU bedeutet, merkt sich nur die letzten Nummern. Und da es in der Größe begrenzt ist, sollten Sie sicherstellen, dass es zu Ihrem Anwendungsverhalten passt. – Natalie

+0

Der Name ist etwas ungenau. Das * default * ist LRU mit einer 128-Grenze, aber es kann unendlich trivial gemacht werden (man übergibt einfach 'None' als' maxsize'). Auf diese Weise läuft es auch schneller (kein Overhead mit Cache-Räumung). – ShadowRanger

Verwandte Themen