I'd treat the def/lambda statement as "compile time" and the () operator
as "run time".
But function definitions occur at run time, not compile time -- they are
executable statements, not instructions to the compiler to define a
function.
For example:
py> dis("def f(x): return x+1") # Python 3.2
1 0 LOAD_CONST 0 (<code object f at 0xb7b57de0,
file "<dis>", line 1>)
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (f)
9 LOAD_CONST 1 (None)
12 RETURN_VALUE
The code object is pre-compiled at compile time, but the function and
name-binding (the "def") doesn't occur until runtime.
At compile time, Python parses the source code and turns it into byte-
code. Class and function definitions are executed at run time, the same
as any other statement.
I'm not sure if this is a difference that makes a difference or not; I
think it is, but don't know enough about how closures and scoping rules
work in other languages to be sure that it does make a difference.