[Python-checkins] r68297 - sandbox/trunk/dbm_sqlite/Lib/dbm/sqlite.py

skip.montanaro python-checkins at python.org
Sun Jan 4 13:36:29 CET 2009


Author: skip.montanaro
Date: Sun Jan  4 13:36:29 2009
New Revision: 68297

Log:
Add iterkeys() perf check.  Why should iterkeys() be slower() than keys()?


Modified:
   sandbox/trunk/dbm_sqlite/Lib/dbm/sqlite.py

Modified: sandbox/trunk/dbm_sqlite/Lib/dbm/sqlite.py
==============================================================================
--- sandbox/trunk/dbm_sqlite/Lib/dbm/sqlite.py	(original)
+++ sandbox/trunk/dbm_sqlite/Lib/dbm/sqlite.py	Sun Jan  4 13:36:29 2009
@@ -6,147 +6,185 @@
 * Obvious speed problems (all tests performed on 2.2GHz MacBook Pro running
   OSX 10.5.4 with SQLite 3.6.2):
 
-    PYTHON=python3.0
+PYTHON=python3.0
 
-    $PYTHON -c 'import sqlite3
-    print("module version:", sqlite3.version_info)
-    print("sqlite version:", sqlite3.sqlite_version_info)
-    '
-
-    echo
-    echo 'read from file'
-    for m in dumb gnu ndbm sqlite ; do
-        echo $m
-        for n in 10 100 ; do
-            rm -f /tmp/trash.db*
-            $PYTHON -m timeit -s 'import dbm.'$m' as db' \
-                              -s 'f = db.open("/tmp/trash.db", "c")' \
-                              -s 'f[b"1"] = b"a"' \
-                              'for i in range('$n'): x = f[b"1"]'
-        done
-    done
-
-    echo
-    echo 'read from :memory:'
-    for m in sqlite ; do
-        echo $m
-        for n in 10 100 ; do
-            $PYTHON -m timeit -s 'import dbm.'$m' as db' \
-                              -s 'f = db.open(":memory:", "c")' \
-                              -s 'f[b"1"] = b"a"' \
-                              'for i in range('$n'): x = f[b"1"]'
-        done
-    done
-
-    echo
-    echo 'write to file'
-    for m in dumb gnu ndbm sqlite ; do
-        echo $m
-        for n in 10 100 ; do
-            rm -f /tmp/trash.db*
-            $PYTHON -m timeit -s 'import dbm.'$m' as db' \
-                    -s 'f = db.open("/tmp/trash.db", "c")' \
-                    'for i in range('$n'): f[bytes(str(i), "ascii")] = bytes(str(i), "ascii")'
-        done
-    done
-
-    echo
-    echo 'write to :memory:'
-    for m in sqlite ; do
-        echo $m
-        for n in 10 100 ; do
-            $PYTHON -m timeit -s 'import dbm.'$m' as db' \
-                              -s 'f = db.open(":memory:", "c")' \
-                              'for i in range('$n'): f[bytes(str(i), "ascii")] = bytes(str(i), "ascii")'
-        done
-    done
-
-    echo
-    echo 'keys from file'
-    for m in dumb gnu ndbm sqlite ; do
-        echo $m
-        for n in 10 100 ; do
-            rm -f /tmp/trash.db*
-            $PYTHON -m timeit -s 'import dbm.'$m' as db' \
-                              -s 'f = db.open("/tmp/trash.db", "c")' \
-                              -s 'f[b"1"] = b"a"' \
-                              'for i in range('$n'): x = f.keys()'
-        done
-    done
-
-    echo
-    echo 'keys from :memory:'
-    for m in sqlite ; do
-        echo $m
-        for n in 10 100 ; do
-            $PYTHON -m timeit -s 'import dbm.'$m' as db' \
-                              -s 'f = db.open(":memory:", "c")' \
-                              -s 'f[b"1"] = b"a"' \
-                              'for i in range('$n'): x = f.keys()'
-        done
+$PYTHON -c 'import sqlite3
+print("module version:", sqlite3.version_info)
+print("sqlite version:", sqlite3.sqlite_version_info)
+'
+
+echo
+echo 'read from file'
+for m in dumb gnu ndbm sqlite ; do
+    for n in 10 100 1000 ; do
+        rm -f /tmp/trash.db*
+        echo -n "$m $n: "
+        $PYTHON -m timeit -s 'import dbm.'$m' as db' \
+                          -s 'f = db.open("/tmp/trash.db", "c")' \
+                          -s 'f[b"1"] = b"a"' \
+                          'for i in range('$n'): x = f[b"1"]'
     done
+done
+
+echo
+echo 'read from :memory:'
+for m in sqlite ; do
+    for n in 10 100 1000 ; do
+        echo -n "$m $n: "
+        $PYTHON -m timeit -s 'import dbm.'$m' as db' \
+                          -s 'f = db.open(":memory:", "c")' \
+                          -s 'f[b"1"] = b"a"' \
+                          'for i in range('$n'): x = f[b"1"]'
+    done
+done
+
+echo
+echo 'write to file'
+for m in dumb gnu ndbm sqlite ; do
+    for n in 10 100 1000 ; do
+        rm -f /tmp/trash.db*
+        echo -n "$m $n: "
+        $PYTHON -m timeit -s 'import dbm.'$m' as db' \
+                -s 'f = db.open("/tmp/trash.db", "c")' \
+                'for i in range('$n'): f[bytes(str(i), "ascii")] = bytes(str(i), "ascii")'
+    done
+done
+
+echo
+echo 'write to :memory:'
+for m in sqlite ; do
+    for n in 10 100 1000 ; do
+        echo -n "$m $n: "
+        $PYTHON -m timeit -s 'import dbm.'$m' as db' \
+                          -s 'f = db.open(":memory:", "c")' \
+                          'for i in range('$n'): f[bytes(str(i), "ascii")] = bytes(str(i), "ascii")'
+    done
+done
+
+echo
+echo 'keys from file'
+for m in dumb gnu ndbm sqlite ; do
+    for n in 10 100 1000 ; do
+        rm -f /tmp/trash.db*
+        echo -n "$m $n: "
+        $PYTHON -m timeit -s 'import dbm.'$m' as db' \
+                          -s 'f = db.open("/tmp/trash.db", "c")' \
+                          -s 'f[b"1"] = b"a"' \
+                          'for i in range('$n'): x = f.keys()'
+    done
+done
+
+echo
+echo 'keys from :memory:'
+for m in sqlite ; do
+    for n in 10 100 1000 ; do
+        echo -n "$m $n: "
+        $PYTHON -m timeit -s 'import dbm.'$m' as db' \
+                          -s 'f = db.open(":memory:", "c")' \
+                          -s 'f[b"1"] = b"a"' \
+                          'for i in range('$n'): x = f.keys()'
+    done
+done
+
+echo
+echo 'iterkeys from file'
+for m in dumb sqlite ; do
+    for n in 10 100 1000 ; do
+        rm -f /tmp/trash.db*
+        echo -n "$m $n: "
+        $PYTHON -m timeit -s 'import dbm.'$m' as db' \
+                          -s 'f = db.open("/tmp/trash.db", "c")' \
+                          -s 'f[b"1"] = b"a"' \
+                          'for i in range('$n'): x = f.iterkeys()'
+    done
+done
+
+echo
+echo 'iterkeys from :memory:'
+for m in sqlite ; do
+    for n in 10 100 1000 ; do
+        echo -n "$m $n: "
+        $PYTHON -m timeit -s 'import dbm.'$m' as db' \
+                          -s 'f = db.open(":memory:", "c")' \
+                          -s 'f[b"1"] = b"a"' \
+                          'for i in range('$n'): x = f.iterkeys()'
+    done
+done
 
 As of 2009-01-04 I get this output on a 2.2GHz MacBook Pro:
 
-    module version: (2, 4, 1)
-    sqlite version: (3, 6, 2)
+module version: (2, 4, 1)
+sqlite version: (3, 6, 2)
 
-    read from file
-    dumb 10: 1000 loops, best of 3: 1.03 msec per loop
-    dumb 100: 100 loops, best of 3: 10.2 msec per loop
-    dumb 1000: 10 loops, best of 3: 103 msec per loop
-    gnu 10: 100000 loops, best of 3: 4.32 usec per loop
-    gnu 100: 10000 loops, best of 3: 38.8 usec per loop
-    gnu 1000: 1000 loops, best of 3: 394 usec per loop
-    ndbm 10: 100000 loops, best of 3: 3.54 usec per loop
-    ndbm 100: 10000 loops, best of 3: 31.2 usec per loop
-    ndbm 1000: 1000 loops, best of 3: 321 usec per loop
-    sqlite 10: 1000 loops, best of 3: 261 usec per loop
-    sqlite 100: 100 loops, best of 3: 2.53 msec per loop
-    sqlite 1000: 10 loops, best of 3: 25.7 msec per loop
-
-    read from :memory:
-    sqlite 10: 1000 loops, best of 3: 237 usec per loop
-    sqlite 100: 100 loops, best of 3: 2.31 msec per loop
-    sqlite 1000: 10 loops, best of 3: 23.1 msec per loop
-
-    write to file
-    dumb 10: 100 loops, best of 3: 3.88 msec per loop
-    dumb 100: 10 loops, best of 3: 42.4 msec per loop
-    dumb 1000: 10 loops, best of 3: 424 msec per loop
-    gnu 10: 1000 loops, best of 3: 295 usec per loop
-    gnu 100: 100 loops, best of 3: 2.94 msec per loop
-    gnu 1000: 10 loops, best of 3: 30 msec per loop
-    ndbm 10: 10000 loops, best of 3: 27.3 usec per loop
-    ndbm 100: 1000 loops, best of 3: 281 usec per loop
-    ndbm 1000: 100 loops, best of 3: 6.07 msec per loop
-    sqlite 10: 1000 loops, best of 3: 764 usec per loop
-    sqlite 100: 100 loops, best of 3: 8.39 msec per loop
-    sqlite 1000: 10 loops, best of 3: 95.9 msec per loop
-
-    write to :memory:
-    sqlite 10: 1000 loops, best of 3: 295 usec per loop
-    sqlite 100: 100 loops, best of 3: 3.3 msec per loop
-    sqlite 1000: 10 loops, best of 3: 35.1 msec per loop
-
-    keys from file
-    dumb 10: 100000 loops, best of 3: 14.7 usec per loop
-    dumb 100: 10000 loops, best of 3: 142 usec per loop
-    dumb 1000: 1000 loops, best of 3: 1.44 msec per loop
-    gnu 10: 10000 loops, best of 3: 35.9 usec per loop
-    gnu 100: 1000 loops, best of 3: 354 usec per loop
-    gnu 1000: 100 loops, best of 3: 3.52 msec per loop
-    ndbm 10: 100000 loops, best of 3: 5.72 usec per loop
-    ndbm 100: 10000 loops, best of 3: 52.5 usec per loop
-    ndbm 1000: 1000 loops, best of 3: 534 usec per loop
-    sqlite 10: 10000 loops, best of 3: 181 usec per loop
-    sqlite 100: 1000 loops, best of 3: 1.8 msec per loop
-    sqlite 1000: 100 loops, best of 3: 18.3 msec per loop
-
-    keys from :memory:
-    sqlite 10: 10000 loops, best of 3: 165 usec per loop
-    sqlite 100: 1000 loops, best of 3: 1.67 msec per loop
-    sqlite 1000: 100 loops, best of 3: 16.6 msec per loop
+read from file
+dumb 10: 1000 loops, best of 3: 1.04 msec per loop
+dumb 100: 100 loops, best of 3: 10.4 msec per loop
+dumb 1000: 10 loops, best of 3: 104 msec per loop
+gnu 10: 100000 loops, best of 3: 4.41 usec per loop
+gnu 100: 10000 loops, best of 3: 38.5 usec per loop
+gnu 1000: 1000 loops, best of 3: 395 usec per loop
+ndbm 10: 100000 loops, best of 3: 3.64 usec per loop
+ndbm 100: 10000 loops, best of 3: 31.1 usec per loop
+ndbm 1000: 1000 loops, best of 3: 320 usec per loop
+sqlite 10: 1000 loops, best of 3: 258 usec per loop
+sqlite 100: 100 loops, best of 3: 2.57 msec per loop
+sqlite 1000: 10 loops, best of 3: 25.4 msec per loop
+
+read from :memory:
+sqlite 10: 1000 loops, best of 3: 233 usec per loop
+sqlite 100: 100 loops, best of 3: 2.32 msec per loop
+sqlite 1000: 10 loops, best of 3: 23.2 msec per loop
+
+write to file
+dumb 10: 100 loops, best of 3: 3.89 msec per loop
+dumb 100: 10 loops, best of 3: 40.9 msec per loop
+dumb 1000: 10 loops, best of 3: 415 msec per loop
+gnu 10: 1000 loops, best of 3: 306 usec per loop
+gnu 100: 100 loops, best of 3: 2.96 msec per loop
+gnu 1000: 10 loops, best of 3: 30.1 msec per loop
+ndbm 10: 10000 loops, best of 3: 27 usec per loop
+ndbm 100: 1000 loops, best of 3: 283 usec per loop
+ndbm 1000: 100 loops, best of 3: 6.08 msec per loop
+sqlite 10: 1000 loops, best of 3: 750 usec per loop
+sqlite 100: 100 loops, best of 3: 8.19 msec per loop
+sqlite 1000: 10 loops, best of 3: 94.1 msec per loop
+
+write to :memory:
+sqlite 10: 1000 loops, best of 3: 293 usec per loop
+sqlite 100: 100 loops, best of 3: 3.25 msec per loop
+sqlite 1000: 10 loops, best of 3: 34.9 msec per loop
+
+keys from file
+dumb 10: 100000 loops, best of 3: 14.6 usec per loop
+dumb 100: 10000 loops, best of 3: 141 usec per loop
+dumb 1000: 1000 loops, best of 3: 1.43 msec per loop
+gnu 10: 10000 loops, best of 3: 35.3 usec per loop
+gnu 100: 1000 loops, best of 3: 354 usec per loop
+gnu 1000: 100 loops, best of 3: 3.56 msec per loop
+ndbm 10: 100000 loops, best of 3: 5.78 usec per loop
+ndbm 100: 10000 loops, best of 3: 53.1 usec per loop
+ndbm 1000: 1000 loops, best of 3: 532 usec per loop
+sqlite 10: 10000 loops, best of 3: 183 usec per loop
+sqlite 100: 1000 loops, best of 3: 1.79 msec per loop
+sqlite 1000: 100 loops, best of 3: 18 msec per loop
+
+keys from :memory:
+sqlite 10: 10000 loops, best of 3: 164 usec per loop
+sqlite 100: 1000 loops, best of 3: 1.64 msec per loop
+sqlite 1000: 100 loops, best of 3: 16.4 msec per loop
+
+iterkeys from file
+dumb 10: 100000 loops, best of 3: 9.87 usec per loop
+dumb 100: 10000 loops, best of 3: 93.3 usec per loop
+dumb 1000: 1000 loops, best of 3: 943 usec per loop
+sqlite 10: 1000 loops, best of 3: 285 usec per loop
+sqlite 100: 100 loops, best of 3: 2.91 msec per loop
+sqlite 1000: 10 loops, best of 3: 29.1 msec per loop
+
+iterkeys from :memory:
+sqlite 10: 1000 loops, best of 3: 265 usec per loop
+sqlite 100: 100 loops, best of 3: 2.63 msec per loop
+sqlite 1000: 10 loops, best of 3: 26.5 msec per loop
 
 Note the poor performance compared to dbm.dumb while reading keys.
 """


More information about the Python-checkins mailing list