目录 Foreword Preface 1.Understanding Performant Python The Fundamental Computer System Computing Units Memory Units Communications Layers Putting the Fundamental Elements Together Idealized Computing Versus the Python Virtual Machine So Why Use Python? How to Be a Highly Performant Programmer Good Working Practices Some Thoughts on Good Notebook Practice Getting the Joy Back into Your Work 2.Profiling to Find Bottlenecks. Profiling Efficiently Introducing the Julia Set Calculating the Full Julia Set Simple Approaches to Timing—print and a Decorator Simple Timing Using the Unix time Command Using the cProfile Module Visualizing cProfile Output with SnakeViz Using line_profiler for Line-by-Line Measurements Using memory_profiler to Diagnose Memory Usage Introspecting an Existing Process with PySpy Bytecode: Under the Hood Using the dis Module to Examine CPython Bytecode Different Approaches, Different Co mplexity Unit Testing During Optimization to Maintain Correctness No-op @profile Decorator Strategies to Profile Your Code Successfully Wrap-Up 3.Lists and Tuples A More Efficient Search Lists Versus Tuples Lists as Dynamic Arrays Tuples as Static Arrays Wrap-Up 4.Dictionaries and Sets. How Do Dictionaries and Sets Work? Inserting and Retrieving Deletion Resizing Hash Functions and Entropy Dictionaries and Namespaces Wrap-Up 5.Iterators and Generators. Iterators for Infinite Series Lazy Generator Evaluation Wrap-Up