import random from string import ascii_uppercase as alphabet zipf = [1/x for x in range(1, 1+26)] def zipf_string(length): letters = random.choices(alphabet, weights=zipf, k=length) return ''.join(letters) def sizes_to_test(): yield from range(1, 10) m = 10 while m < 100_000: yield m m += m // 2 + 1 def do_timings(): import pyperf runner = pyperf.Runner() # silence the warnings runner.parse_args() runner.args.quiet = True runner._process_priority = lambda *args: None haystack = zipf_string(10**6) for m in sizes_to_test(): runner.timeit(f"needle={m}", setup="needle = zipf_string(m); i = random.randrange(1000); substack = haystack[i:]", stmt="needle in substack", globals=locals() | globals()) if __name__ == "__main__": do_timings()