Warum ist cffi so viel schneller als numpy?

Ich habe mit dem Schreiben von CFFI-Modulen in Python herumgespielt und ihre Geschwindigkeit lässt mich fragen, ob ich Standard-Python richtig verwende. Es bringt mich dazu, komplett auf C umzusteigen! Um ehrlich zu sein, gibt es einige großartige Python-Bibliotheken, die ich in C nie wieder implementieren könnte. Das ist also hypothetischer als alles andere.

Dieses Beispiel zeigt die Summenfunktion in Python, die mit einem Numpy-Array verwendet wird, und wie langsam sie im Vergleich zu einer c-Funktion ist. Gibt es eine schnellere pythonische Methode zur Berechnung der Summe eines Numpy-Arrays?

def cast_matrix(matrix, ffi):
    ap = ffi.new("double* [%d]" % (matrix.shape[0]))
    ptr = ffi.cast("double *", matrix.ctypes.data)
    for i in range(matrix.shape[0]):
        ap[i] = ptr + i*matrix.shape[1]                                                                
    return ap 

ffi = FFI()
ffi.cdef("""
double sum(double**, int, int);
""")
C = ffi.verify("""
double sum(double** matrix,int x, int y){
    int i, j; 
    double sum = 0.0;
    for (i=0; i<x; i++){
        for (j=0; j<y; j++){
            sum = sum + matrix[i][j];
        }
    }
    return(sum);
}
""")
m = np.ones(shape=(10,10))
print 'numpy says', m.sum()

m_p = cast_matrix(m, ffi)

sm = C.sum(m_p, m.shape[0], m.shape[1])
print 'cffi says', sm

nur um die funktion zu zeigen funktioniert:

numpy says 100.0
cffi says 100.0

jetzt, wenn ich diese einfache Funktion zeitlich einstelle, finde ich, dass Numpy wirklich langsam ist! Benutze ich Numpy richtig? Gibt es eine schnellere Möglichkeit, die Summe in Python zu berechnen?

import time
n = 1000000

t0 = time.time()
for i in range(n): C.sum(m_p, m.shape[0], m.shape[1])
t1 = time.time()

print 'cffi', t1-t0

t0 = time.time()
for i in range(n): m.sum()
t1 = time.time()

print 'numpy', t1-t0

mal:

cffi 0.818415880203
numpy 5.61657714844

Antworten auf die Frage(1)

Ihre Antwort auf die Frage