43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
"""Tests to show that the benchmarks we based our speed optimizations on are
|
|
still valid"""
|
|
import unittest
|
|
from functools import partial
|
|
from timeit import timeit
|
|
|
|
timeit = partial(timeit, number=500000)
|
|
|
|
class TestBenchmarks(unittest.TestCase):
|
|
def test_lists_vs_dicts(self):
|
|
"""See what's faster at int key lookup: dicts or lists."""
|
|
list_time = timeit('item = l[9000]', 'l = [0] * 10000')
|
|
dict_time = timeit('item = d[9000]', 'd = {x: 0 for x in range(10000)}')
|
|
|
|
# Dicts take about 1.6x as long as lists in Python 2.6 and 2.7.
|
|
self.assertTrue(list_time < dict_time, '%s < %s' % (list_time, dict_time))
|
|
|
|
|
|
def test_call_vs_inline(self):
|
|
"""How bad is the calling penalty?"""
|
|
no_call = timeit('l[0] += 1', 'l = [0]')
|
|
call = timeit('add(); l[0] += 1', 'l = [0]\n'
|
|
'def add():\n'
|
|
' pass')
|
|
|
|
# Calling a function is pretty fast; it takes just 1.2x as long as the
|
|
# global var access and addition in l[0] += 1.
|
|
self.assertTrue(no_call < call, '%s (no call) < %s (call)' % (no_call, call))
|
|
|
|
|
|
def test_startswith_vs_regex(self):
|
|
"""Can I beat the speed of regexes by special-casing literals?"""
|
|
re_time = timeit(
|
|
'r.match(t, 19)',
|
|
'import re\n'
|
|
"r = re.compile('hello')\n"
|
|
"t = 'this is the finest hello ever'")
|
|
startswith_time = timeit("t.startswith('hello', 19)",
|
|
"t = 'this is the finest hello ever'")
|
|
|
|
# Regexes take 2.24x as long as simple string matching.
|
|
self.assertTrue(startswith_time < re_time,
|
|
'%s (startswith) < %s (re)' % (startswith_time, re_time)) |