LonelyMan Skrevet 21. desember 2012 Skrevet 21. desember 2012 (endret) Hei, jeg har installert python runtimes og jeg lurer på hvilke metoder jeg kan bruke for å mest effektivt generere random integere på raskest mulig måte, hvilken metode er raskest? Jeg ønsker å se om jeg kan slå min egen assembler generator. Hvor mange tall per sekund kan jeg generere random ints i python? Kan noen hjelpe meg å sette opp et python script for å teste hastigheten? Det hadde vært gøy å se om pypy er raskere på random ints (SNIPPSAT) snakket om pypy i går i en annen tråd, jeg vet ikke om pypy har noen form for optimalisering der. Jeg har ingen anelse hvor jeg ligger an hen i forhold til python (eller andre språk for den slags skyld) Endret 21. desember 2012 av LonelyMan
grapz Skrevet 21. desember 2012 Skrevet 21. desember 2012 (endret) Python er ikke min sterkeste side, men noe i retning av dette (Python 2.7): import random import datetime start = datetime.datetime.now() for i in range(0, 1000000): random.randint(0, 1000000) end = datetime.datetime.now() delta = end - start print("Microseconds: %i" % delta.microseconds) Genererer 1 million tall mellom 0-1000000. Den skriver ikke ut til skjerm etterhvert som den lager tallene. Vær obs på at det kan nok være raskere måter å gjøre det på. Endret 21. desember 2012 av grapz
LonelyMan Skrevet 21. desember 2012 Forfatter Skrevet 21. desember 2012 (endret) Hvor mange tall genererer den per mikrosekund eller per sekund hos deg? Endret 21. desember 2012 av LonelyMan
grapz Skrevet 21. desember 2012 Skrevet 21. desember 2012 (endret) Endret koden litt for å bruke cProfile i stedet for time. Så, det tar 2.366 sekunder å kjøre 1000000 randoms. Så hos meg tar det 2.366 mikrosekund per random. Oppdatert kode: import random import cProfile import pstats def genrand(): for i in range(0, 1000000): random.randint(0, 1000000) def measure(): cProfile.run('genrand()', 'randstat') p = pstats.Stats('randstat') p.sort_stats('name') p.print_stats() measure() Endret 21. desember 2012 av grapz
LonelyMan Skrevet 21. desember 2012 Forfatter Skrevet 21. desember 2012 Hvordan kan jeg få den siste rutinen din til å printe resultatet i en messagebox istedet for til en fil?
grapz Skrevet 21. desember 2012 Skrevet 21. desember 2012 Har ikke peiling. Med du kan vel bare kjøre den i Python command line hvis du er på Windows? Da vil den iallefall skrive outputen til vinduet, og ikke fil.
LonelyMan Skrevet 21. desember 2012 Forfatter Skrevet 21. desember 2012 (endret) Jeg fikk 3000004 function calls in 1.233 seconds (med det siste eksemplet ditt) Endret 21. desember 2012 av LonelyMan
grapz Skrevet 21. desember 2012 Skrevet 21. desember 2012 Her er min output (Python 3.2) på en i5-3470 @ 3.2GHz: p.strip_dirs().print_stats() Fri Dec 21 12:33:50 2012 randstat 5048652 function calls in 2.359 seconds Random listing order was used ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 2.359 2.359 {built-in method exec} 1000000 0.393 0.000 2.093 0.000 random.py:211(randint) 1048648 0.252 0.000 0.252 0.000 {method 'getrandbits' of '_random.Random' objects} 1000000 0.763 0.000 1.699 0.000 random.py:166(randrange) 1 0.266 0.266 2.359 2.359 <pyshell#6>:1(genrand) 1 0.000 0.000 2.359 2.359 <string>:1(<module>) 1000000 0.628 0.000 0.936 0.000 random.py:217(_randbelow) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 1000000 0.056 0.000 0.056 0.000 {method 'bit_length' of 'int' objects}
LonelyMan Skrevet 21. desember 2012 Forfatter Skrevet 21. desember 2012 Betyr det at du genererer 5048652 numre på 2,359 sekunder? Går det an å inline random rutinen istedet for å kalle den en gang hver iterasjon?
siDDis Skrevet 21. desember 2012 Skrevet 21. desember 2012 Nå er det å benchmarke random tall heilt håplaust, då det rt forskjellige implementasjonar som går på kor random talla eigentleg er. F.eks så blir ikkje /dev/random rekna som veldig random, men openssl derimot er mykje meir random. Ytelsen mellom dei to er som natt og dag. Ellers: http://stackoverflow...mbers-in-python 1
LonelyMan Skrevet 21. desember 2012 Forfatter Skrevet 21. desember 2012 (endret) Hvor raskt genererer de tall i den linken du linker til siDDis, er den forskjellig fra den vi bruker her? Random rutinen behøver ikke være kryptografisk sikker, den skal bare være noenlunde random, ha kommet gjennom diehard testen. Endret 21. desember 2012 av LonelyMan
grapz Skrevet 21. desember 2012 Skrevet 21. desember 2012 Tja, den genererer ikke ca 5 millioner nummer, men randint metoden er ikke i bunnen av random stacken, så den må kalle seg nedover. Så hver randint kall resulterer i 4 andre metodekall, så da ender jeg opp på ca 5 millioner. siDDis, ja stemmer bra det.
LonelyMan Skrevet 21. desember 2012 Forfatter Skrevet 21. desember 2012 Men siden python er et scriptespråk så kan det høres ut som inlining ikke er mulig eller tar jeg feil her, kan man inline random funksjonen du bruker?
grapz Skrevet 21. desember 2012 Skrevet 21. desember 2012 (endret) Men siden python er et scriptespråk så kan det høres ut som inlining ikke er mulig eller tar jeg feil her, kan man inline random funksjonen du bruker? Tenker du noe i retning av dette: def measure(): cProfile.run('[random.randint(0, 1000000) for x in range(0, 1000000)]', 'randstat') p = pstats.Stats('randstat') p.sort_stats('name') p.print_stats() Endret 21. desember 2012 av grapz
LonelyMan Skrevet 21. desember 2012 Forfatter Skrevet 21. desember 2012 Jeg har aldri brukt python før, så du må fortelle meg hva forskjellen i denne er fra den gamle?
etse Skrevet 21. desember 2012 Skrevet 21. desember 2012 For effektivt bruk av tall i Python, så vill jeg brukt biblioteket "numPy". Der er veldig mange ting ferdig implementert med effektive algoritmer. Da kan du skrive kode lignende dette: import numpy randInts = nympy.random.randint(1000, size=10000) Dette vil generere 10000 random integere, mellom 0 og 1000. Med bruk av numPy vil du få en implementasjon som er over 100 ganger raskere. (målinger på min maskin ga meg 150 ganger raskere).
LonelyMan Skrevet 21. desember 2012 Forfatter Skrevet 21. desember 2012 Kan du lage et script som bruker numPy og gi en måling på det, per mikrosekund eller per sekund?
etse Skrevet 21. desember 2012 Skrevet 21. desember 2012 (endret) Stjeler dette fra stackoverflow: import timeit t1 = timeit.Timer('[random.randint(0,1000) for r in xrange(10000)]','import random') # v1 ### change v2 so that it picks numbers in (0,10000) and thus runs... t2 = timeit.Timer('random.sample(range(10000), 10000)','import random') # v2 t3 = timeit.Timer('nprnd.randint(1000, size=10000)','import numpy.random as nprnd') # v3 print t1.timeit(1000)/1000 print t2.timeit(1000)/1000 print t3.timeit(1000)/1000 Resultater fra han som svarte (kjøretid), nederste er med numpy 0.0233682730198 0.00781716918945 0.000147947072983 Edit: Glemte å importere timeit. Endret 21. desember 2012 av etse
etse Skrevet 21. desember 2012 Skrevet 21. desember 2012 (endret) Er det millisekund? nei, sekunder.Hver av de genererer 10.000 tall. Gjør dette 1000 ganger og tar gjennomsnitt. Så du ser at python sin innebygde er meget treg. Edit: altså er det tid i sekunder det tar å generere 10.000 tilfeldige tall. Ikke for et tall. Endret 21. desember 2012 av etse
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå