Я довольно новичок в python, так что это может быть очень простой c вопрос.
Я использую лямбда-функцию для передачи некоторых аргументов в вызов функции в GUI для плагин, над которым я работаю (Autodesk Maya). Работает отлично.
Я также подумал об использовании functools.partial для этого и попытался решить, "сравнив" два вызова:
import cProfile, pstats
from io import StringIO
import functools
class Profiler():
def __init__(self):
self.pr = cProfile.Profile()
self.pr.enable()
def end(self):
self.pr.disable()
s = StringIO()
sort = 'tottime'
ps = pstats.Stats(self.pr, stream=s).sort_stats(sort)
ps.print_stats()
print(s.getvalue())
class SimpleClass:
def method(self,x,y):
return x * y
simpleClass = SimpleClass()
lmbd = lambda: simpleClass.method(2,2)
fnct = functools.partial(simpleClass.method,2,2)
num = 10000000
profiler = Profiler()
for i in range(num):
lmbd()
profiler.end()
profiler = Profiler()
for i in range(num):
fnct()
profiler.end()
Однако профилировщик показывает, что лямбда-функция требует гораздо больше время выполнения, и у него в два раза больше вызовов, однако functools.partial работает намного быстрее и работает, как и ожидалось.
20000002 function calls in 2.462 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
10000000 1.780 0.000 2.462 0.000 c:/Users/George/Desktop/bench.py:26(<lambda>)
10000000 0.683 0.000 0.683 0.000 c:/Users/George/Desktop/bench.py:21(method)
1 0.000 0.000 0.000 0.000 c:/Users/George/Desktop/bench.py:11(end)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
10000002 function calls in 0.678 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
10000000 0.678 0.000 0.678 0.000 c:/Users/George/Desktop/bench.py:21(method)
1 0.000 0.000 0.000 0.000 c:/Users/George/Desktop/bench.py:11(end)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
Может кто-нибудь объяснить, пожалуйста, что я делаю не так и почему происходит такое огромная разница?