Думаю, что фундаментальная причина «медлительности» Python – объектно-ориентированная модель самого языка, что часто излагают так: «всё в Python — классы и объекты».
Если, к примеру, вычислять факториал числа с использованием переменной, замыкания (closure), класса, то время его вычисления будет приблизительно одно и тоже:
import time
class Fun:
def __init__(self, a):
self.a = a
def fun1(a):
def fun2(f):
nonlocal a
a *= f
return a
return fun2
f = 50_000 # вычисляется факториал этого числа
start = time.time()
m0 = Fun(1)
for i in range(2, f+1):
m0.a *= i
sec = time.time() - start
print(f"{'При использовании экземпляра класса:':.<40}{sec} c")
start = time.time()
m1 = fun1(1)
for i in range(2, f+1):
m1(i)
sec = time.time() - start
print(f"{'При использовании замыкания:':.<40}{sec} c")
start = time.time()
rez = 1
for i in range(2, f+1):
rez *= i
sec = time.time() - start
print(f"{'При использовании переменной:':.<40}{sec} c")
'''
При использовании экземпляра класса:....1.0973212718963623 c
При использовании замыкания:............1.1133134365081787 c
При использовании переменной:...........1.0213711261749268 c
'''
Объектная ориентированность никак не влияет на быстродействие языка.
C++ тоже объектно ориентированный, но достаточно быстрый.