En Sat, 18 Jul 2009 12:31:46 -0300, Alan G Isaac <alan.is...@gmail.com> escribió:

On Fri, 17 Jul 2009 05:19:50 +0000, Alan G Isaac wrote:
def apply2(itr, methodname, *args, **kwargs):
    f = operator.methodcaller(methodname, *args, **kwargs)
    for item in itr:
        f(item)


On 7/17/2009 3:45 AM Steven D'Aprano apparently wrote:
for obj in objects:
    getattr(obj, methodname)(*args, **kwargs)


Are there any obvious considerations in choosing
between those two?

The operator.methodcaller version is faster in my tests for large collections, but slightly slower when you have very few elements.

<code>
import operator
import timeit

class X:
  def method(self, x, y, **kw): pass

def apply1(itr, methodname, *args, **kwargs):
    for item in itr:
        getattr(item, methodname)(*args, **kwargs)

def apply2(itr, methodname, *args, **kwargs):
    f = operator.methodcaller(methodname, *args, **kwargs)
    for item in itr:
        f(item)

L=[X() for _ in range(3000)]
apply1(L,'method', 1, 2, foo=3)
apply2(L,'method', 1, 2, foo=3)

timeit.timeit(setup="from __main__ import apply1,apply2,L", stmt="apply1(L,'method', 1, 2, foo=3)", number=1000) timeit.timeit(setup="from __main__ import apply1,apply2,L", stmt="apply2(L,'method', 1, 2, foo=3)", number=1000)
</code>

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to