diff options
author | Jordan Cook <jordan.cook@pioneer.com> | 2021-08-20 23:17:06 -0500 |
---|---|---|
committer | Jordan Cook <jordan.cook@pioneer.com> | 2021-08-20 23:17:06 -0500 |
commit | e6fff586cd94685e7a8354170e070cb692ad4430 (patch) | |
tree | bae47940232ba51b07c8a3cab5298cc18dcd384a | |
parent | 9c89fe2a5f696e2ea786fb368529e3cb421c0b57 (diff) | |
download | requests-cache-e6fff586cd94685e7a8354170e070cb692ad4430.tar.gz |
Add CLI arg to benchmark script to select a backend
-rw-r--r-- | docs/examples.md | 4 | ||||
-rwxr-xr-x | examples/benchmark.py | 69 | ||||
-rw-r--r-- | requests_cache/backends/dynamodb.py | 4 | ||||
-rw-r--r-- | requests_cache/backends/sqlite.py | 2 |
4 files changed, 62 insertions, 17 deletions
diff --git a/docs/examples.md b/docs/examples.md index 4e5df65..0ed67f5 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -68,13 +68,13 @@ The following scripts can also be found in the ### Cache speed test ```{include} ../examples/benchmark.py :start-line: 2 -:end-line: 3 +:end-line: 8 ``` :::{admonition} Example code :class: toggle ```{literalinclude} ../examples/benchmark.py -:lines: 1,5- +:lines: 1,10- ``` ::: diff --git a/examples/benchmark.py b/examples/benchmark.py index b37ffef..6992b9a 100755 --- a/examples/benchmark.py +++ b/examples/benchmark.py @@ -1,46 +1,75 @@ #!/usr/bin/env python """ An example of benchmarking cache write speeds with semi-randomized response content + +Usage: +``` +python benchmark.py -b <backend name> +``` """ +from argparse import ArgumentParser from os import urandom from random import random from time import perf_counter as time import requests +from rich import print +from rich.progress import Progress from requests_cache import CachedResponse, CachedSession BASE_RESPONSE = requests.get('https://httpbin.org/get') -CACHE_NAME = 'rubbish_bin.sqlite' +CACHE_NAME = 'rubbish_bin' +WARMUP_ITERATIONS = 100 ITERATIONS = 5000 -MAX_RESPONSE_SIZE = 1024 * 1024 +MAX_RESPONSE_SIZE = 1024 * 350 +# Defaults for DynamoDB +AWS_OPTIONS = { + 'endpoint_url': 'http://localhost:8000', + 'region_name': 'us-east-1', + 'aws_access_key_id': 'placeholder', + 'aws_secret_access_key': 'placeholder', +} -def test_write_speed(session): - print(f'Testing write speed over {ITERATIONS} iterations') - start = time() - for i in range(ITERATIONS): +def test_write_speed(session): + for i in range(WARMUP_ITERATIONS): new_response = get_randomized_response(i) session.cache.save_response(new_response) + with Progress() as progress: + task = progress.add_task('[cyan]Testing write speed...', total=ITERATIONS) + start = time() + + for i in range(ITERATIONS): + new_response = get_randomized_response(i) + session.cache.save_response(new_response) + progress.update(task, advance=1) + elapsed = time() - start avg = (elapsed / ITERATIONS) * 1000 - print(f'Elapsed: {elapsed:.3f} (avg {avg:.3f}ms per write)') + print(f'[cyan]Elapsed: [green]{elapsed:.3f}[/] seconds (avg [green]{avg:.3f}[/] ms per write)') def test_read_speed(session): - print(f'Testing read speed over {ITERATIONS} iterations') keys = list(session.cache.responses.keys()) - start = time() - - for i in range(ITERATIONS): - key = keys[i % ITERATIONS] + for i in range(WARMUP_ITERATIONS): + key = keys[i % len(keys)] session.cache.get_response(key) + with Progress() as progress: + task = progress.add_task('[cyan]Testing read speed...', total=ITERATIONS) + start = time() + + for i in range(ITERATIONS): + key = keys[i % len(keys)] + session.cache.get_response(key) + progress.update(task, advance=1) + elapsed = time() - start avg = (elapsed / ITERATIONS) * 1000 - print(f'Elapsed: {elapsed:.3f} (avg {avg:.3f}ms per read)') + print(f'[cyan]Elapsed: [green]{elapsed:.3f}[/] seconds (avg [green]{avg:.3f}[/] ms per read)') def get_randomized_response(i=0): @@ -53,6 +82,18 @@ def get_randomized_response(i=0): if __name__ == '__main__': - session = CachedSession(CACHE_NAME, backend='sqlite') + parser = ArgumentParser() + parser.add_argument('-b', '--backend', default='sqlite') + args = parser.parse_args() + print(f'[cyan]Benchmarking {args.backend} backend') + + kwargs = {} + if args.backend == 'dynamodb': + kwargs = AWS_OPTIONS + elif args.backend == 'sqlite-memory': + args.backend = 'sqlite' + kwargs = {'use_memory': True} + + session = CachedSession(CACHE_NAME, backend=args.backend, **kwargs) test_write_speed(session) test_read_speed(session) diff --git a/requests_cache/backends/dynamodb.py b/requests_cache/backends/dynamodb.py index b97952a..d30d55f 100644 --- a/requests_cache/backends/dynamodb.py +++ b/requests_cache/backends/dynamodb.py @@ -7,6 +7,10 @@ Services <https://aws.amazon.com>`_. In terms of features and use cases, it is r MongoDB and other NoSQL databases. It is an especially good fit for serverless applications running on `AWS Lambda <https://aws.amazon.com/lambda>`_. +.. warning:: + DynamoDB binary item sizes are limited to 400KB. If you need to cache larger responses, consider + using a different backend. + Connection Options ^^^^^^^^^^^^^^^^^^ The DynamoDB backend accepts any keyword arguments for :py:meth:`boto3.session.Session.resource`. diff --git a/requests_cache/backends/sqlite.py b/requests_cache/backends/sqlite.py index 4429bc9..a66e228 100644 --- a/requests_cache/backends/sqlite.py +++ b/requests_cache/backends/sqlite.py @@ -92,7 +92,7 @@ When working with average-sized HTTP responses (< 1MB) and using a modern SSD fo can expect speeds of around: * Write: 2-8ms -* Read: 0.3-0.6ms +* Read: 0.2-0.6ms Of course, this will vary based on hardware specs, response size, and other factors. |