[Python-checkins] r69232 - in sandbox/trunk/dbm_sqlite/alt: dbsqlite.py time_sqlite.py

raymond.hettinger python-checkins at python.org
Tue Feb 3 02:24:47 CET 2009


Author: raymond.hettinger
Date: Tue Feb 3 02:24:46 2009
New Revision: 69232
Log:
Faster version of __len__().
Modified:
 sandbox/trunk/dbm_sqlite/alt/dbsqlite.py
 sandbox/trunk/dbm_sqlite/alt/time_sqlite.py
Modified: sandbox/trunk/dbm_sqlite/alt/dbsqlite.py
==============================================================================
--- sandbox/trunk/dbm_sqlite/alt/dbsqlite.py	(original)
+++ sandbox/trunk/dbm_sqlite/alt/dbsqlite.py	Tue Feb 3 02:24:46 2009
@@ -37,7 +37,7 @@
 self.conn.commit()
 
 def __len__(self):
- GET_LEN = 'SELECT COUNT(*) FROM shelf'
+ GET_LEN = 'SELECT MAX(ROWID) FROM shelf'
 return self.conn.execute(GET_LEN).fetchone()[0]
 
 def keys(self):
@@ -63,7 +63,7 @@
 raise KeyError(key)
 return item[0]
 
- def __setitem__(self, key, value):
+ def __setitem__(self, key, value): 
 ADD_ITEM = 'REPLACE INTO shelf (key, value) VALUES (?,?)'
 self.conn.execute(ADD_ITEM, (key, value))
 #self.conn.commit()
@@ -71,7 +71,7 @@
 def __delitem__(self, key):
 if key not in self:
 raise KeyError(key)
- DEL_ITEM = 'DELETE FROM shelf WHERE key = ?'
+ DEL_ITEM = 'DELETE FROM shelf WHERE key = ?' 
 self.conn.execute(DEL_ITEM, (key,))
 #self.conn.commit()
 
@@ -84,8 +84,8 @@
 if kwds:
 self.update(kwds)
 
- def clear(self):
- CLEAR_ALL = 'DELETE FROM shelf; VACUUM;'
+ def clear(self): 
+ CLEAR_ALL = 'DELETE FROM shelf; VACUUM;' 
 self.conn.executescript(CLEAR_ALL)
 self.conn.commit()
 
@@ -96,27 +96,27 @@
 self.conn = None
 
 def __del__(self):
- self.close()
+ self.close() 
 
 class ListRepr:
 
 def __repr__(self):
- return repr(list(self))
+ return repr(list(self)) 
 
 class SQLhashKeysView(collections.KeysView, ListRepr):
-
+ 
 def __iter__(self):
 GET_KEYS = 'SELECT key FROM shelf ORDER BY ROWID'
 return map(itemgetter(0), self._mapping.conn.cursor().execute(GET_KEYS))
 
 class SQLhashValuesView(collections.ValuesView, ListRepr):
-
+ 
 def __iter__(self):
 GET_VALUES = 'SELECT value FROM shelf ORDER BY ROWID'
 return map(itemgetter(0), self._mapping.conn.cursor().execute(GET_VALUES))
 
 class SQLhashItemsView(collections.ValuesView, ListRepr):
-
+ 
 def __iter__(self):
 GET_ITEMS = 'SELECT key, value FROM shelf ORDER BY ROWID'
 return iter(self._mapping.conn.cursor().execute(GET_ITEMS))
@@ -131,7 +131,7 @@
 for d in SQLhash(), SQLhash('example'):
 print(list(d), "start")
 d['abc'] = 'lmno'
- print(d['abc'])
+ print(d['abc']) 
 d['abc'] = 'rsvp'
 d['xyz'] = 'pdq'
 print(d.items())
@@ -140,7 +140,7 @@
 print(list(d), 'list')
 d.update(p='x', q='y', r='z')
 print(d.items())
-
+ 
 del d['abc']
 try:
 print(d['abc'])
@@ -148,7 +148,7 @@
 pass
 else:
 raise Exception('oh noooo!')
-
+ 
 try:
 del d['abc']
 except KeyError:
Modified: sandbox/trunk/dbm_sqlite/alt/time_sqlite.py
==============================================================================
--- sandbox/trunk/dbm_sqlite/alt/time_sqlite.py	(original)
+++ sandbox/trunk/dbm_sqlite/alt/time_sqlite.py	Tue Feb 3 02:24:46 2009
@@ -63,6 +63,8 @@
 'SELECT key FROM shelf',
 'SELECT value FROM shelf',
 'SELECT key, value FROM shelf',
+ 'SELECT COUNT(*) FROM shelf',
+ 'SELECT MAX(ROWID) FROM shelf',
 ]
 
 FINDKEY = [
@@ -123,12 +125,13 @@
 return '%.2f' % (clock() - start)
 
 n, m = 2000, 6000
-fragment, vacuum = True, True
+
 seed('xyzpdqbingo')
 items = populate(n)
-if 0:
- dellist = [(randrange(n),) for i in range(m)]
- addlist = populate(m)
+if 1:
+ fragment, vacuum = False, False
+## dellist = [(randrange(n),) for i in range(m)]
+## addlist = populate(m)
 for stmt in SELECTORS:
 print(stmt)
 for builder, name in [MAKE_SHELF, MAKE_SHELF_PRIMARY, MAKE_SHELF_UNIQUE]:
@@ -137,7 +140,7 @@
 fragmentit(conn, addlist, dellist)
 if vacuum:
 conn.execute('VACUUM')
- print(sorted(timeit(conn, stmt, (), n=100) for i in range(6)), name)
+ print(sorted(timeit(conn, stmt, (), n=10000) for i in range(6)), name)
 print()
 else:
 pairs = sample(items, 3)
@@ -165,6 +168,10 @@
 Missing key search 8% faster than a found key
 "SELECT 1" is 3% faster than "SELECT key" which is 3% faster than "SELECT value"
 
+Finding the length of the table:
+ "SELECT MAX(ROWID)" beats "SELECT COUNT(*)"
+ Disassembly shows the former goes straight to the last record,
+ while the latter does a full table scan.
 
 ----- Unfragmented: n, m = 2000, 6000
 
@@ -291,4 +298,12 @@
 ['0.57', '0.57', '0.57', '0.58', '0.58', '0.58'] b'jgmOI'
 ['0.55', '0.55', '0.55', '0.56', '0.56', '0.57'] b'oNJuV'
 
+
+----- Find length of the table -----
+
+SELECT COUNT(*) FROM shelf
+['2.36', '2.37', '2.37', '2.37', '2.39', '2.47'] PRIMARY
+
+SELECT MAX(ROWID) FROM shelf
+['0.50', '0.50', '0.50', '0.50', '0.51', '0.55'] PRIMARY
 '''


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /