2017-12-07 3 views
-1

Ich schreibe ein Python-Skript von einem Matlab. Es passiert, dass der Code in Matlab viel schneller läuft (etwa 10 Minuten weniger), also könntest du mir vielleicht helfen herauszufinden, was ich falsch mache. Ich lief alle Sitzungen in Python, und ich fand, dass die langsamsten sind die beiden folgenden:Schneller Code numpy

X = xi * math.cos(theta) + zi * (math.sin(theta)) 
Y = yi 
Z = xi * ((-1) * math.sin(theta)) + zi * (math.cos(theta)) 

x2 = [a * b * c * X[i]/np.sqrt((a * c * Y[i])**2 + b**2 * (
    c**2 * (X[i])**2 + a**2 * (Z[i])**2)) for i in range(len(X))] 
y2 = [a * b * c * Y[i]/np.sqrt((a * c * Y[i])**2 + b**2 * (
    c**2 * X[i]**2 + a**2 * Z[i]**2)) for i in range(len(X))] 
zt = c**2 * (1 - (x2/a)**2 - (y2/b)**2) 
i = 0 
z2 = [] 
for i in range(len(Z)): 
    z2.append((-1 if Z[i] < 0 else 1) * np.sqrt(zt[i])) 

wo xi, yi und zi sind numpy Schwimmer von mehr als 1 Million Elemente

danke

+0

(1) 10 Minuten weniger bedeutet nicht viel. 1 gegen 11; 100 gegen 110? (2) Mach ein echtes Profiling, vielleicht mit line_profiler. Vielleicht solltest du diese Ausgabe mit einbeziehen (3) Übertraust du wirklich über Millionen Elemente in dieser Schleife? (4) Liste append ist super-langsam komplex-weise (** edit: ** scheint, ich bin falsch oder ungenau hier; aber versuchen Sie Folgendes)! Ordnen Sie ein Array vor. Du hast jetzt die Größe a-priori! (5) Die letzte Zeile kann auch in numpy vektorisiert werden. – sascha

+1

@sascha: 'liste.append' ist amortisierte konstante Zeit; es ist 'numpy.append', das die schreckliche Zeitkomplexität hat. – user2357112

+0

sascha, ich bin neu in Python, könntest du mir mit den 4 und 5 helfen, auf die du hingewiesen hast? –

Antwort

1

für für z2 Teil

In [1]: import numpy as np 
In [2]: zz =np.array([1, 2, 3, -1, -2, -3, 0]) 
In [3]: aa = np.array([1, 2, 3, 4, 5, 6, 64]) 
In [4]: Z =np.array([1, 2, 3, -1, -2, -3, 0]) 
In [5]: zt = np.array([1, 2, 3, 4, 5, 6, 64]) 
In [6]: np.sign(Z) * np.sqrt(zt) 
Out[7]: 
array([ 1., 1.41421356, 1.73205081, -2., -2.23606798, -2.44948974, 0. ]) 
Verwandte Themen