#!/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 environmentimport randomrandom.seed(1234)import loggingfrom pprint import pprintfrom sys import stdout as STDOUT# Write all output to a temporary directoryimport atexitimport gcimport ioimport osimport tempfileTEST_DIR = tempfile.TemporaryDirectory()atexit.register(TEST_DIR.cleanup)# Make sure Windows processes exit cleanlyOLD_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 1class Email:def __init__(self, sender, receiver, message):self.sender = senderself.receiver = receiverself.message = message# Example 2def get_emails():yield Email('foo@example.com', 'bar@example.com', 'hello1')yield Email('baz@example.com', 'banana@example.com', 'hello2')yield Noneyield Email('meep@example.com', 'butter@example.com', 'hello3')yield Email('stuff@example.com', 'avocado@example.com', 'hello4')yield Noneyield Email('thingy@example.com', 'orange@example.com', 'hello5')yield Email('roger@example.com', 'bob@example.com', 'hello6')yield Noneyield Email('peanut@example.com', 'alice@example.com', 'hello7')yield NoneEMAIL_IT = get_emails()class NoEmailError(Exception):passdef try_receive_email():# Returns an Email instance or raises NoEmailErrortry:email = next(EMAIL_IT)except StopIteration:email = Noneif not email:raise NoEmailErrorprint(f'Produced email: {email.message}')return email# Example 3def produce_emails(queue):while True:try:email = try_receive_email()except NoEmailError:returnelse:queue.append(email) # Producer# Example 4def consume_one_email(queue):if not queue:returnemail = queue.pop(0) # Consumer# Index the message for long-term archivalprint(f'Consumed email: {email.message}')# Example 5def loop(queue, keep_running):while keep_running():produce_emails(queue)consume_one_email(queue)def make_test_end():count=list(range(10))def func():if count:count.pop()return Truereturn Falsereturn funcdef my_end_func():passmy_end_func = make_test_end()loop([], my_end_func)# Example 6import timeitdef print_results(count, tests):avg_iteration = sum(tests) / len(tests)print(f'Count {count:>5,} takes {avg_iteration:.6f}s')return count, avg_iterationdef list_append_benchmark(count):def run(queue):for i in range(count):queue.append(i)tests = timeit.repeat(setup='queue = []',stmt='run(queue)',globals=locals(),repeat=1000,number=1)return print_results(count, tests)# Example 7def print_delta(before, after):before_count, before_time = beforeafter_count, after_time = aftergrowth = 1 + (after_count - before_count) / before_countslowdown = 1 + (after_time - before_time) / before_timeprint(f'{growth:>4.1f}x data size, {slowdown:>4.1f}x time')baseline = list_append_benchmark(500)for count in (1_000, 2_000, 3_000, 4_000, 5_000):print()comparison = list_append_benchmark(count)print_delta(baseline, comparison)# Example 8def list_pop_benchmark(count):def prepare():return list(range(count))def run(queue):while queue:queue.pop(0)tests = timeit.repeat(setup='queue = prepare()',stmt='run(queue)',globals=locals(),repeat=1000,number=1)return print_results(count, tests)# Example 9baseline = list_pop_benchmark(500)for count in (1_000, 2_000, 3_000, 4_000, 5_000):print()comparison = list_pop_benchmark(count)print_delta(baseline, comparison)# Example 10import collectionsdef consume_one_email(queue):if not queue:returnemail = queue.popleft() # Consumer# Process the email messageprint(f'Consumed email: {email.message}')def my_end_func():passmy_end_func = make_test_end()EMAIL_IT = get_emails()loop(collections.deque(), my_end_func)# Example 11def deque_append_benchmark(count):def prepare():return collections.deque()def run(queue):for i in range(count):queue.append(i)tests = timeit.repeat(setup='queue = prepare()',stmt='run(queue)',globals=locals(),repeat=1000,number=1)return print_results(count, tests)baseline = deque_append_benchmark(500)for count in (1_000, 2_000, 3_000, 4_000, 5_000):print()comparison = deque_append_benchmark(count)print_delta(baseline, comparison)# Example 12def dequeue_popleft_benchmark(count):def prepare():return collections.deque(range(count))def run(queue):while queue:queue.popleft()tests = timeit.repeat(setup='queue = prepare()',stmt='run(queue)',globals=locals(),repeat=1000,number=1)return print_results(count, tests)baseline = dequeue_popleft_benchmark(500)for count in (1_000, 2_000, 3_000, 4_000, 5_000):print()comparison = dequeue_popleft_benchmark(count)print_delta(baseline, comparison)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。