#!/usr/bin/env PYTHONHASHSEED=1234 python3 # Copyright 2014-2019 Brett Slatkin, Pearson Education Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Reproduce book environment import random random.seed(1234) import logging from pprint import pprint from sys import stdout as STDOUT # Write all output to a temporary directory import atexit import gc import io import os import tempfile TEST_DIR = tempfile.TemporaryDirectory() atexit.register(TEST_DIR.cleanup) # Make sure Windows processes exit cleanly OLD_CWD = os.getcwd() atexit.register(lambda: os.chdir(OLD_CWD)) os.chdir(TEST_DIR.name) def close_open_files(): everything = gc.get_objects() for obj in everything: if isinstance(obj, io.IOBase): obj.close() atexit.register(close_open_files) # Example 1 def move(period, speed): for _ in range(period): yield speed def pause(delay): for _ in range(delay): yield 0 # Example 2 def animate(): for delta in move(4, 5.0): yield delta for delta in pause(3): yield delta for delta in move(2, 3.0): yield delta # Example 3 def render(delta): print(f'Delta: {delta:.1f}') # Move the images onscreen def run(func): for delta in func(): render(delta) run(animate) # Example 4 def animate_composed(): yield from move(4, 5.0) yield from pause(3) yield from move(2, 3.0) run(animate_composed) # Example 5 import timeit def child(): for i in range(1_000_000): yield i def slow(): for i in child(): yield i def fast(): yield from child() baseline = timeit.timeit( stmt='for _ in slow(): pass', globals=globals(), number=50) print(f'Manual nesting {baseline:.2f}s') comparison = timeit.timeit( stmt='for _ in fast(): pass', globals=globals(), number=50) print(f'Composed nesting {comparison:.2f}s') reduction = -(comparison - baseline) / baseline print(f'{reduction:.1%} less time')