Penso che dipenda davvero dalla lingua e dalla funzione.
Sebbene i compilatori c e c ++ possano incorporare molte funzioni, questo non è il caso per Python o Java.
Anche se non conosco i dettagli specifici di java (eccetto che ogni metodo è virtuale ma ti consiglio di controllare meglio la documentazione), in Python sono sicuro che non ci sono inlining, nessuna ottimizzazione della ricorsione di coda e chiamate di funzione sono abbastanza costoso.
Le funzioni Python sono fondamentalmente oggetti eseguibili (e infatti è anche possibile definire il metodo call () per trasformare una funzione di istanza di oggetto in una funzione).
Ciò significa che c'è un bel po 'di overhead nel chiamarli ...
MA
quando definisci le variabili all'interno delle funzioni, l'interprete usa il LOADFAST invece della normale istruzione LOAD nel bytecode, rendendo il tuo codice più veloce ...
Un'altra cosa è che quando definisci un oggetto callable, sono possibili modelli come la memoizzazione e possono effettivamente accelerare molto il tuo calcolo (al costo di usare più memoria). Fondamentalmente è sempre un compromesso.
Il costo delle chiamate di funzione dipende anche dai parametri, perché determinano la quantità di cose che devi copiare sullo stack (quindi in c / c ++ è prassi comune passare grandi parametri come le strutture tramite puntatori / riferimenti invece che per valore).
Penso che la tua domanda sia in pratica troppo ampia per poter rispondere completamente su stackexchange.
Quello che ti suggerisco di fare è iniziare con una lingua e studiare la documentazione avanzata per capire come le chiamate di funzione sono implementate da quel linguaggio specifico.
Sarai sorpreso da quante cose imparerai in questo processo.
Se hai un problema specifico, fai misurazioni / profilazione e decidi il tempo è meglio creare una funzione o copiare / incollare il codice equivalente.
se fai una domanda più specifica, sarebbe più facile ottenere una risposta più specifica, credo.