improve tracing performance when f_trace is NULL (closes #16672)

Patch by Xavier de Gaye.
diff --git a/Python/ceval.c b/Python/ceval.c
index 32c203e..5f6f35c 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1277,7 +1277,8 @@
         /* line-by-line tracing support */
 
         if (_Py_TracingPossible &&
-            tstate->c_tracefunc != NULL && !tstate->tracing) {
+                tstate->c_tracefunc != NULL && !tstate->tracing &&
+                f->f_trace != NULL) {
             int err;
             /* see maybe_call_line_trace
                for expository comments */
@@ -3008,7 +3009,7 @@
         /* Log traceback info. */
         PyTraceBack_Here(f);
 
-        if (tstate->c_tracefunc != NULL)
+        if (tstate->c_tracefunc != NULL && f->f_trace != NULL)
             call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, f);
 
 fast_block_end:
@@ -3127,7 +3128,7 @@
     }
 
     if (tstate->use_tracing) {
-        if (tstate->c_tracefunc) {
+        if (tstate->c_tracefunc && f->f_trace != NULL) {
             if (why == WHY_RETURN || why == WHY_YIELD) {
                 if (call_trace(tstate->c_tracefunc,
                                tstate->c_traceobj, f,