Ich schreibe eine ziemlich große Simulation in Python und hoffte, etwas zusätzliche Leistung von Cython zu bekommen. Für den folgenden Code scheint ich jedoch nicht allzu viel zu bekommen, obwohl er eine ziemlich große Schleife enthält. Etwa 100.000 Iterationen.Cython Optimierung
Habe ich einige Anfänger Fehler gemacht oder ist diese Loop-Größe einfach zu klein, um einen großen Effekt zu haben? (In meinen Tests war der Cython-Code nur etwa 2 mal schneller).
import numpy as np;
cimport numpy as np;
import math
ctypedef np.complex64_t cpl_t
cpl = np.complex64
def example(double a, np.ndarray[cpl_t,ndim=2] A):
cdef int N = 100
cdef np.ndarray[cpl_t,ndim=3] B = np.zeros((3,N,N),dtype = cpl)
cdef Py_ssize_t n, m;
for n in range(N):
for m in range(N):
if np.sqrt(A[0,n]) > 1:
B[0,n,m] = A[0,n] + 1j * A[0,m]
return B;
Sie machen einen 'np.sqrt' Aufruf innerhalb der Schleife. Das sieht nach einem Leistungsproblem aus. Warum ist es überhaupt in der Schleife? 'a' ändert sich nie. Warum nicht einfach 'wenn a <= 1: B vor der Schleife zurückgeben? – user2357112
@GWW: Das sieht für mich die erste Reihe aus. – user2357112
@ user2357112 Danke, das ist eigentlich etwas, das ich übersehen habe, ich kann das verschieben. Tatsächlich, sind mathematische Operationen wie np.sqrt() oder np.exp() etwas, das ich in Cython vermeiden sollte? – physicsGuy