2017-11-22 2 views
0

Gibt es eine Python-eingebaute (oder einfach nur optimierte) Funktion, um die Floor Division und den Rest gleichzeitig in zwei separaten Variablen zu erhalten?Floor Division und Remainder gleichzeitig in 2 separaten Variablen erhalten

Beispiel:

a, b = 10 divided by 4 

Wunschergebnisse:

a = 2 
b = 2 

Ich brauche dies eine optimierte Lösung.

Ergebnisse Performance:

erstes Stück Code:

for i in range(10000000): 
    a, b = divmod(i, 5) 
took 3.99 seconds to run 

zweites Stück Code:

for i in range(10000000): 
    a = i // 5 
    b = i % 5 
took 2.56 seconds to run 

Bemerkungen:

Lesen Sie @casevh Antwort für eine detailliertere Erklärung.

tldr: divmod() funktioniert besser, wenn Zahlen groß sind.

+1

Ich vermute, Sie nicht nach diesem Code sind aber gedacht, überprüfen: a = 10 b = 2 div = a // b mod = a% b –

+0

@KatiaPunter Ich war für eine Art der Suche von integrierten funktionieren, weil diese manchmal viel schneller sind. Aber ich werde diese Lösung auch mal überprüfen und sehen, welche besser funktioniert. Danke – joaoavf

+0

@joaoavf Woher hast du diese Zahlen? 'Nahm 2,56 Sekunden bis run' und' dauerte 3,99 Sekunden –

Antwort

7

Verwenden Sie dies. das wird dir helfen.

a,b = divmod(10,2) 

es wird sowohl Wert zurück

+0

Fehle ich etwas? Weil das nur "a = 2" und "b = 2" ergibt, nicht was OP verlangt, wo "b = 0.5". –

+1

Oh, er hat die Frage bearbeitet, um einfach nur 'a% b' zu fragen. Meinetwegen. –

+0

Das kümmert sich genau darum, was ich brauche. Ich werde es auf Leistung testen. Vielen Dank. – joaoavf

4

Ich glaube, Sie suchen divmod() Bibliotheksfunktion

Hier ist ein link to its docs

Beispiel

>>> a, b = divmod(10, 4) 
>>> print a, b 
>>> 2 2 
1

Es gibt einen signifikanten Unterschied in Leistung, wenn Sie verwenden größere Zahlen. Hier

ist ein Beispiel kleine und große Zahlen mit:

$ py27 -m timeit -s "a=123;b=7" "divmod(a,b)" 
10000000 loops, best of 3: 0.0913 usec per loop 
$ py27 -m timeit -s "a=123;b=7" "a//b;a%b" 
10000000 loops, best of 3: 0.047 usec per loop 
$ py27 -m timeit -s "a=123333333333333333333333333333333333333;b=7222222222222222222" "divmod(a,b)" 
10000000 loops, best of 3: 0.165 usec per loop 
$ py27 -m timeit -s "a=123333333333333333333333333333333333333;b=7222222222222222222" "a//b;a%b" 
1000000 loops, best of 3: 0.232 usec per loop 

Warum der Unterschied?

divmod() erfordert einen Funktionsaufruf, während // und% Operatoren sind. Es gibt einen zusätzlichen Overhead für einen Funktionsaufruf relativ zu Operatoren. Wenn also die Kosten der Berechnung minimal sind, ist der Overhead beim Aufruf einer Funktion viel größer als die tatsächlichen Kosten der Berechnung (en).

Für größere Zahlen ist divmod() schneller. divmod() berechnet sowohl den Quotienten als auch den Rest zur gleichen Zeit und gibt beide zurück. Die Operatoren // und% berechnen jeweils den Quotienten und den Rest, geben aber nur eines der Ergebnisse zurück.

divmod() hat mehr Overhead, führt aber nur eine Division durch. // und% haben weniger Overhead, aber zwei Divisionen. Solange der Overhead im Vergleich zur Zeit groß ist, um division durchzuführen, wird divmod() langsamer sein.Aber sobald die Kosten einer Division größer als der Overhead ist, wird Divmod() schneller sein.

+0

Vielen Dank! Ich schätze deine Einsicht sehr. – joaoavf

Verwandte Themen