2016-06-01 14 views
-5

Ich bin neu bei Python.
Ich weiß ein bisschen C++, arbeitete mit Arrays. Arrays in C++ sind nicht so langsam.
Ist es die Liste, die es verlangsamt? Ich bin mir nicht sicher, ob es möglich ist, Tupel zu verwenden.
Warum ist dieser Code in Python langsam?

import random 
list1=[] 
n=1000000 
for i in range(n): 
    list1.append(random.randint(1,6)) 

x1=list1.count(1) 
x2=list1.count(2) 
x3=list1.count(3) 
x4=list1.count(4) 
x5=list1.count(5) 
x6=list1.count(6) 

xp1=(100*x1)/n 
xp2=(100*x2)/n 
xp3=(100*x3)/n 
xp4=(100*x4)/n 
xp5=(100*x5)/n 
xp6=(100*x6)/n 

print("The number 1 was found %d - %.2f percent" %(x1,xp1)) 
print("The number 2 was found %d - %.2f percent" %(x2,xp2)) 
print("The number 3 was found %d - %.2f percent" %(x3,xp3)) 
print("The number 4 was found %d - %.2f percent" %(x4,xp4)) 
print("The number 5 was found %d - %.2f percent" %(x5,xp5)) 
print("The number 6 was found %d - %.2f percent" %(x6,xp6)) 
+2

Python interpretiert und auf einer virtuellen Maschine laufen, während C++ in Maschinencode kompiliert wird, so wird es immer viel langsamer als c sein ++. .. – Gusman

+0

@AHL - Ja, es muss eine Million Mal ausgeführt werden, um eine Million Zufallszahlen zu generieren. Wenn man es nur sieben Mal laufen ließe, würde das nur sieben Zufallszahlen ergeben, was kein sehr großes Sample ist (warum sowieso sieben?). – TigerhawkT3

+0

@Gusman Dieser Punkt wurde sehr oft auf dieser Website gemacht, wurde aber sehr selten bewiesen. –

Antwort

3

versuchen random.randint(1, 6) Lauf eine Million mal langsam ist, hat es wenig mit Ihrer Liste zu tun:

In [18]: %timeit for i in xrange(1000000): random.randint(1, 6) 
1 loops, best of 3: 1.33 s per loop 

Sie können erhalten sogar schneller, wenn Sie Graben random.randint() und wechseln Sie in nur 1 + int(random.random() * 6) und eine Liste Verständnis verwenden:

In [111]: %timeit for i in xrange(1000000): 1 + int(random.random() * 7) 
1 loops, best of 3: 300 ms per loop 

Die einfachste Geschwindigkeitsverbesserung wäre numpy zu verwenden:

In [20]: %timeit numpy.random.randint(1, 7, size=1000000) 
100 loops, best of 3: 16.3 ms per loop 
0

Es ist nicht die Liste, die die Laufzeit dominiert, aber der Aufruf von random.randint. Wenn Sie list1.append(random.randint(1,6)) durch list1.append(1) ersetzen, wäre es leicht 10 mal schneller.

Auch eine Liste Verständnis mit append als for Schleife etwas schneller sein sollte, so können Sie

n = 1000000 
list1 = [random.randint(1,6) for i in range(n)]