I does a mistake in my last, that is the results (error in parameters of mysqldb connection)
Local database Update 1000 MySQLdb 0.0319998264313 Update 1000 SqlAlchemy 0.265999794006 France-Tunisia Update 1000 MySQLdb 10.3910000324 Update 1000 SqlAlchemy 42.1579999924 Sorry 2009/10/2 Christian Démolis <christiandemo...@gmail.com> > *Hello M. Bayer > > Ok i understand now what it is strange > > My configuration > I m on windows xp pro sp3 > Python is 2.5.2 > SqlAlchemy is 0.5.6 > Dell optiplex 755 > Intel core 2 duo e8300 > 2go ram > ** > I dont pass any paremeters in create_engine, is it wrong?* > > chaine = > 'mysql://'+ParametresDeConnection["Identifiant"]+":"+ParametresDeConnection["MotDePasse"]+'@'+ParametresDeConnection['Ip']+'/'+ParametresDeConnection["BaseDeDonnees"] > engine = create_engine(chaine) > * > This is the final part of my declaration* > > class Query(Query): > def __init__(self, *arg, **kw): > self._populate_existing = True > super(Query, self).__init__(*arg, **kw) > > Session = scoped_session(sessionmaker(autocommit=True, bind=engine, > query_cls=Query)) > session = Session() > > import MySQLdb > db = MySQLdb.connection(host="192.168.0.110", user="apm", passwd="apm", > db="azeane") > print "AvecMySQlDB" > xref = time.time() > for x in xrange(100): > db.query("""UPDATE utilisateur SET Dispo="+str(x%2)+" WHERE > IdUtilisateur=1""") > r = db.store_result() > print "Update 1000 MySQLdb", time.time()-xref > > xreftotal = time.time() > for x in xrange(100): > > session.query(Utilisateur).filter(Utilisateur.IdUtilisateur==1).update({'Dispo':x%2}, > False) > print "Update 1000 SqlAlchemy", time.time()-xref > > *As u can see, i m not in transactional mode.* *I add a new benchmark and > i execute it with local database and tunisia database > Local results > Update 1000 MySQLdb 0.0160000324249 > Update 1000 SqlAlchemy 0.235000133514 > > Tunisia results > Update 1000 MySQLdb 0.0160000324249 > Update 1000 SqlAlchemy 31.0309998989 > > It s crazy ^^ > > I don t know why my station is slow? Do u have an idea?* > > > 2009/10/1 Michael Bayer <mike...@zzzcomputing.com> > >> >> Christian Démolis wrote: >> > Maybe because the database is in Tunisia and my Computer in France. >> > I don t use sqlite, i use MySQL. >> > I just did a test on internet in Tunisia, 39kbits/sec upload and >> > 417kbits/sec >> >> right but, you had these results: >> >> MySQLdb - .09 seconds >> ORM - .3 seconds >> >> so, network overhead of sending "update " string to tunisia, is at most >> .09 seconds. SQLAlchemy also pulls the cursor.rowcount back, so that >> perhaps adds network overhead as well (and you would see this in the >> profiling results), although that should be tiny. so .21 seconds of >> overhead approximately would appear to be spent locally. whereas on my >> system within .21 seconds I can issue that same amount of work a few >> thousand times. the simple ORM examples you have should not be issuing >> any other SQL statements. >> >> >> > >> > 2009/10/1 Michael Bayer <mike...@zzzcomputing.com> >> > >> >> >> >> Christian Démolis wrote: >> >> > With debug mode it seems to take 0.15 second, my timer print 0.45 s >> >> > i don t know why this difference? >> >> > >> >> > 2009-10-01 17:00:38,586 INFO sqlalchemy.engine.base.Engine.0x...7f50 >> >> > UPDATE >> >> > utilisateur SET `Dispo`=%s WHERE utilisateur.`IdU >> >> > tilisateur` = %s >> >> > 2009-10-01 17:00:38,586 INFO sqlalchemy.engine.base.Engine.0x...7f50 >> >> [0, >> >> > 1L] >> >> > 2009-10-01 17:00:38,743 INFO sqlalchemy.engine.base.Engine.0x...7f50 >> >> > COMMIT >> >> > With ORM force update 0.453000068665 >> >> >> >> On my workstation which is an intel mac, I can run 1000 >> >> Session.execute("update...") against a sqlite memory db statements in >> >> .15 >> >> seconds, using the simple time.time() approach to measure. The sqlite >> >> cursor directly, which is against an empty table so is insanely fast, >> >> can >> >> run 1000 in .01 seconds, so that is .14 seconds of overhead within >> SQLA. >> >> >> >> In your case, you're getting .2-.3 seconds of overhead just for *one* >> >> statement, subtracting what your database call takes natively. >> Meaning >> >> that while I can execute around 8000 Session.execute() statements per >> >> second, you can execute less than five. That seems very strange. >> >> >> >> >> >> >> >> >> >> > >> >> > 2009/10/1 Michael Bayer <mike...@zzzcomputing.com> >> >> > >> >> >> >> >> >> Michael Bayer wrote: >> >> >> > >> >> >> > Christian Démolis wrote: >> >> >> >> Hello, >> >> >> >> >> >> >> >> I tried all the method to compare the different methods : >> >> >> >> >> >> >> >> >> Here's a decorator I would advise using: >> >> >> >> >> >> >> >> >> >> >> >> http://stackoverflow.com/questions/1171166/how-can-i-profile-a-sqlalchemy-powered-application/1175677#1175677 >> >> >> >> >> >> Also I would advise testing this as well. Session.execute() creates >> >> a >> >> >> text() construct which does some regular expression matching that >> you >> >> >> don't need: >> >> >> >> >> >> engine.execute("update table set foo=bar") >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> *TEST CODE* >> >> >> >> >> >> >> >> xref = time.time() >> >> >> >> self.UtilisateurCourant.Dispo = 1 >> >> >> >> session.merge(self.UtilisateurCourant, >> dont_load=True) >> >> >> >> session.flush() >> >> >> >> print "With ORM dont_load", time.time()-xref >> >> >> >> >> >> >> >> xref = time.time() >> >> >> >> >> >> >> >> >> >> >> >> >> >> session.query(Utilisateur).filter(Utilisateur.IdUtilisateur==self.UtilisateurCourant.IdUtilisateur).update({'Dispo':0}, >> >> >> >> False) >> >> >> >> print "With ORM force update", time.time()-xref >> >> >> >> >> >> >> >> xref = time.time() >> >> >> >> if self.UtilisateurCourant.IdUtilisateur: >> >> >> >> session.execute("UPDATE utilisateur SET Dispo=0 >> >> WHERE >> >> >> >> IdUtilisateur="+str(self.UtilisateurCourant.IdUtilisateur)) >> >> >> >> print "With ORM pure SQL", time.time()-xref >> >> >> >> >> >> >> >> import MySQLdb >> >> >> >> db = MySQLdb.connection(host="192.168.45.28", >> >> user="apm", >> >> >> >> passwd="apm", db="test_christian") >> >> >> >> xref = time.time() >> >> >> >> db.query("""UPDATE utilisateur SET Dispo=1 WHERE >> >> >> >> IdUtilisateur=1""") >> >> >> >> r = db.store_result() >> >> >> >> print "With MySQLdb without ORM", time.time()-xref >> >> >> >> >> >> >> >> >> >> >> >> *TEST RESULTS* >> >> >> >> >> >> >> >> With ORM dont_load 0.453000068665 >> >> >> >> With ORM force update 0.296999931335 >> >> >> >> With ORM pure SQL 0.31200003624 >> >> >> >> With MySQLdb without ORM 0.0939998626709 >> >> >> >> >> >> >> >> With ORM dont_load 0.452999830246 >> >> >> >> With ORM force update 0.297000169754 >> >> >> >> With ORM pure SQL 0.31200003624 >> >> >> >> With MySQLdb without ORM 0.0939998626709 >> >> >> >> >> >> >> >> With ORM dont_load 0.453000068665 >> >> >> >> With ORM force update 0.296999931335 >> >> >> >> With ORM pure SQL 0.31200003624 >> >> >> >> With MySQLdb without ORM 0.0940001010895 >> >> >> > >> >> >> > please use the profile module. The call chain from >> >> >> > Session.execute(somestring) down to connection.execute() is >> >> definitely >> >> >> not >> >> >> > three times slower than connection.execute() itself. On my >> >> >> workstation >> >> >> > here I can execute hundreds of ORM queries per second. >> >> >> > >> >> >> > >> >> >> >> >> >> >> >> >> >> >> >> 2009/9/30 Michael Bayer <mike...@zzzcomputing.com> >> >> >> >> >> >> >> >>> >> >> >> >>> Christian Démolis wrote: >> >> >> >>> > Thx for your answer. >> >> >> >>> > MakeReleased is a method of com object windows agent >> >> (self.agent = >> >> >> >>> > DispatchWithEvents('CosmoAgent.clsCCAgent', Evenement)) >> >> >> >>> > It takes 0 second to execute as we can see in the execute >> print >> >> >> >>> >> >> >> >>> yes I realized later there were two blocks of timer calls. The >> >> >> >>> inclusion >> >> >> >>> of that code made the example harder to read. >> >> >> >>> >> >> >> >>> In particular using session.merge() with an object will issue a >> >> >> SELECT >> >> >> >>> first to locate the current row. this is likely the cause of >> >> the >> >> >> >>> slowness in this specific case since you seem to have a slow >> >> network >> >> >> >>> (profiling would reveal this too). Passing "dont_load=True" to >> >> >> >>> merge() >> >> >> >>> will skip the SELECT step and trust that the state you are >> >> passing >> >> >> it >> >> >> >>> is >> >> >> >>> the state that is within the database. >> >> >> >>> >> >> >> >>> > "Orm does additional steps" >> >> >> >>> > is it possible to force him update only one attribute of the >> >> >> object? >> >> >> >>> >> >> >> >>> you may say: >> >> >> >>> >> >> >> >>> >> >> >> >>> >> >> >> >> >> >> session.query(MyObject).filter(some_criterion).update({'attrname':somenewvalue}, >> >> >> >>> False) >> >> >> >>> >> >> >> >>> which will issue an UPDATE statement matching the criterion. >> >> this >> >> >> is >> >> >> >>> the >> >> >> >>> fastest way by far using the ORM only. >> >> >> >>> >> >> >> >>> Changing the "False" to "evaluate" or "expire" will also update >> >> or >> >> >> >>> expire >> >> >> >>> the state of your ORM instance - but that will add some >> overhead. >> >> >> >>> >> >> >> >>> >> >> >> >>> >> >> >> >>> > >> >> >> >>> >> >> >> >> >> >> >> >> > >> >> >> >> >> >> >> > >> >> >> > >> >> >> > > >> >> >> > >> >> >> >> >> >> >> >> >> > >> >> >> >> >> > >> >> > > >> >> > >> >> >> >> >> >> > >> >> >> > >> > > >> > >> >> >> >> >> > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---