Zahl mit einer Millon Stellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
erdal1934
User
Beiträge: 4
Registriert: Samstag 12. November 2016, 13:52

Ich erzeuge eine Zahl mit einer Million Stellen.
Auf meinem Rechner dauert das 5 Minuten.
Kann man das schneller programmieren?

Code: Alles auswählen

num = 0
for i in range(0, 1000*1000)
    num = num*10 + random.randint(0,9)
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

num = random.randint(0, 10**1000000)
Hat ungefähr 10 Sekunden zu programmieren gedauert. Ein Anfänger kann aber dafür auch 20 brauchen.
BlackJack

Wobei beide Lösungen auch Zahlen mit weniger als einer Million Stellen erzeugen können. :-)
erdal1934
User
Beiträge: 4
Registriert: Samstag 12. November 2016, 13:52

Danke, Lösung von sirius braucht nur noch 2 Minuten auf meinem Rechner.
Benutzeravatar
kbr
User
Beiträge: 1510
Registriert: Mittwoch 15. Oktober 2008, 09:27

erdal1934 hat geschrieben:Danke, Lösung von sirius braucht nur noch 2 Minuten auf meinem Rechner.
Das geht bei mir erheblich schneller :D :

Code: Alles auswählen

In [7]: %%timeit
   ...: lower = 10**1000000
   ...: upper = lower * 10 - 1
   ...: num = random.randint(lower, upper)
   ...: 
100 loops, best of 3: 2.17 ms per loop
Compiler time: 0.24 s
BlackJack

@kbr: Vielleicht ist da die Zeit enthalten das Ergebnis auch auszugeben. :-)
erdal1934
User
Beiträge: 4
Registriert: Samstag 12. November 2016, 13:52

Nein, alter Rechner.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

erdal1934 hat geschrieben:Nein, alter Rechner.
Und deine erste Lösung läuft dann in 5 Minuten? Irgendwas passt da nicht. Hast du die for-Schleife noch stehen lassen und nur das Schleifeninnere ersetzt?
erdal1934
User
Beiträge: 4
Registriert: Samstag 12. November 2016, 13:52

danke, ja
BlackJack

Mal zwei deutliche Laufzeitunterschiede:

Code: Alles auswählen

In [3]: import random

In [4]: %%timeit                                                                
   ...: num = 0 
   ...: for i in range(0, 1000*1000):
   ...:     num = num*10 + random.randint(0,9)
   ...: 
1 loop, best of 3: 58min 53s per loop

In [5]: %%timeit
   ...: lower = 10**1000000
   ...: upper = lower * 10 - 1
   ...: num = random.randint(lower, upper)
   ...: 
10 loops, best of 3: 45.1 ms per loop
Compiler time: 6.37 s
Gemessen auf einem Raspi 2.
gast8973
User
Beiträge: 1
Registriert: Montag 14. November 2016, 05:38

Meine Lösung. Langsamer als Lösung 2, aber schneller als Lösung 1.

Code: Alles auswählen

max = 1000000
num = int(''.join(str(random.randint(0,9)) for _ in range(0,max)))
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

gast8973 hat geschrieben:Meine Lösung.
Na gut, wenn wir jetzt schon bei albernen Lösungen sind:

Code: Alles auswählen

int('{}{}'.format(random.choice('123456789'), ''.join(random.choice('0123456789') for _ in range(999999))))
Und 1 Million Stellen sind garantiert.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Wenn die Mindeststellenanzahl garantiert sein soll, kann man das so sicherstellen:

Code: Alles auswählen

num = 0
while len(str(num)) < 10000000:
    num += random.randint(0, 10**1000000)
Hat auch ne super Laufzeit (im besten Falle nur einen Schleifendurchlauf!) :twisted:
heiner88
User
Beiträge: 65
Registriert: Donnerstag 20. Oktober 2016, 07:29

Falls man beide Darstellungen braucht, ist die alberne Lösung trotzdem viel schneller:

Code: Alles auswählen

str1 = '{}{}'.format(random.choice('123456789'), ''.join(random.choice('0123456789') for _ in range(999999)))
num1 = int(str1)

Code: Alles auswählen

lower = 10**1000000
upper = lower * 10 - 1
num2  = random.randint(lower, upper)
str2  = str(num2)
Antworten