i el valor de retorno de una función modificada por el decorador de python solo puede ser Nonetype

Escribí un decorador que obtiene el tiempo de ejecución del programa, pero el valor de retorno de la función se convierte en Nonetype.

def gettime(func):
    def wrapper(*args, **kw):
        t1 = time.time()
        func(*args, **kw)
        t2 = time.time()
        t = (t2-t1)*1000
        print("%s run time is: %.5f ms"%(func.__name__, t))

    return wrapper

Si no uso el decorador, el valor de retorno es correcto.

A = np.random.randint(0,100,size=(100, 100))
B = np.random.randint(0,100,size=(100, 100))
def contrast(a, b):
    res = np.sum(np.equal(a, b))/(A.size)
    return res

res = contrast(A, B)
print("The correct rate is: %f"%res)

El resultado esThe correct rate is: 0.012400

Y si uso el decorador:

@gettime
def contrast(a, b):
    res = np.sum(np.equal(a, b))/len(a)
    return res

res = contrast(A, B)
print("The correct rate is: %f"%res)

Habrá un error:

contrast run time is: 0.00000 ms

TypeError: must be real number, not NoneType

Por supuesto, si elimino elprint, puedo obtener el tiempo de ejecución correcto, pero elres acepta el Nonetype.

Respuestas a la pregunta(2)

Su respuesta a la pregunta