replace StopIteration in cascade_iterator with deque.popleft()

Issue #1932 resolved
Mike Bayer repo owner created an issue

run some timeit() tests to see if the StopIteration call is expensive.

Comments (2)

  1. Mike Bayer reporter

    here's the performance test for reference

    from sqlalchemy import *
    from sqlalchemy.orm import *
    from sqlalchemy.ext.declarative import declarative_base, declared_attr
    
    class Base(object):
        @declared_attr
        def __tablename__(cls):
            return cls.__name__.lower()
    
        @declared_attr
        def id(cls):
            return Column(Integer, primary_key=True)
    
    Base = declarative_base(cls=Base)
    
    class A(Base):
        bs = relationship("B", backref="a")
    
    class B(Base):
        a_id = Column(Integer, ForeignKey('a.id'))
        cs = relationship("C", backref="b")
    
    class C(Base):
        b_id = Column(Integer, ForeignKey('b.id'))
    
    e = create_engine('sqlite://', echo=True)
    Base.metadata.create_all(e)
    
    s = Session()
    
    import timeit
    
    def go():
        for i in xrange(100):
            a1 = A()
            s.add(a1)
            for j in xrange(100):
                a1.bs.append(B(cs=[for q in range(10)](C())))
    
    for i in xrange(3):
        print timeit.Timer('from __main__ import go; go()').timeit(number=1)
        s.close()
    
    """
    no patch:
    
    11.4894669056
    11.4846360683
    11.2541160583
    
    
    deque patch:
    
    10.5410430431
    10.6652979851
    10.5337219238
    
    
    pre-check patch:
    
    10.9065990448
    10.9252810478
    10.7826881409
    
    both patches:
    
    10.2826850414
    10.504420042
    10.2249820232
    
    no iterators:
    
    10.0818679333
    10.3000841141
    10.0632379055
    
    replace string cmp
    
    10.0916140079
    10.3783679008
    10.0499939919
    
    go back to iterator for property,
    maintain backwards compat and encapsulate
    usage of deque:
    
    10.3023788929
    10.1948838234
    10.031416893
    
    """
    

    patch is in 755aca7f5f3f33339dce4f4b6b92b8b7a9c3d180

  2. Log in to comment