Python Лямбда-функция требует в два раза больше вызовов, чем functools.partial. - PullRequest
4 голосов
/ 20 апреля 2020

Я довольно новичок в 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}

Может кто-нибудь объяснить, пожалуйста, что я делаю не так и почему происходит такое огромная разница?

...