\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{gonz95alo} \pdfinfo{ /Title (high-performance-tricks-with-python.pdf) /Creator (Cheatography) /Author (gonz95alo) /Subject (High Performance Tricks with Python Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{1000A3} \definecolor{LightBackground}{HTML}{F7F7FC} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{High Performance Tricks with Python Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{gonz95alo} via \textcolor{DarkBackground}{\uline{cheatography.com/152363/cs/34482/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}gonz95alo \\ \uline{cheatography.com/gonz95alo} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Not Yet Published.\\ Updated 3rd November, 2022.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{2} \begin{tabularx}{8.4cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{8.4cm}}{\bf\textcolor{white}{A word of advice}} \tn \SetRowColor{white} \mymulticolumn{1}{x{8.4cm}}{Before jumping into parallelization and code optimization, try to understand what you are trying to achieve, in comparison with what you've written. Is your code not clean enough? Perhaps untangling it and using of other libraries will help. Does your code make many read/write operations? Perhaps parallelizing in threads will speed it up. Does your code perform the same task over and over again, with minimal changes? Perhaps using parallelization in processes will aid you. \newline % Row Count 10 (+ 10) Perhaps, perhaps, perhaps... think about what you have just coded.% Row Count 12 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{3.52 cm} x{4.48 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Concurrent processes}} \tn % Row 0 \SetRowColor{LightBackground} Main benefit & Parallelize CPU-bound tasks, independent from each other. \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} Import class & `from concurrent.futures import ProcessPoolExecutor` \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} Run parallel tasks & `with ProcessPoolExecutor() as executor: \{\{nl\}\} ~~ results = executor.map(func, list)` \tn % Row Count 11 (+ 5) % Row 3 \SetRowColor{white} Submit a specific task to a core & `with ProcessPoolExecutor() as executor: \{\{nl\}\} ~~ results = \seqsplit{executor.submit(func)`} \tn % Row Count 16 (+ 5) % Row 4 \SetRowColor{LightBackground} Option (number of cores) & \seqsplit{`ProcessPoolExecutor(max\_workers=10)`} \tn % Row Count 18 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{Extra function arguments can be Included before mapping the function in the executor. In order to do so, we need to create a partial version of the function with `partial\_func = functools.partial(func, a=a, b=b, ...)`.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{3.52 cm} x{4.48 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Concurrent threads}} \tn % Row 0 \SetRowColor{LightBackground} Main benefit & Parallelize I/O-bound tasks, independent from each other. \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} Import class & `from concurrent.futures import ThreadPoolExecutor` \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} Run parallel tasks & `with ThreadPoolExecutor() as executor: \{\{nl\}\} ~~ results = executor.map(func, list)` \tn % Row Count 11 (+ 5) % Row 3 \SetRowColor{white} Submit a specific task to a core & `with ThreadPoolExecutor() as executor: \{\{nl\}\} ~~ results = \seqsplit{executor.submit(func)`} \tn % Row Count 16 (+ 5) % Row 4 \SetRowColor{LightBackground} Option (number of cores) & \seqsplit{`ThreadPoolExecutor(max\_workers=10)`} \tn % Row Count 18 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{Extra function arguments can be Included before mapping the function in the executor. In order to do so, we need to create a partial version of the function with `partial\_func = functools.partial(func, a=a, b=b, ...)`.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.64 cm} x{5.36 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Numba library}} \tn % Row 0 \SetRowColor{LightBackground} Main benefit & Useful decorators which compile the function the first time it is used, speeding it up in subsequent runs. \tn % Row Count 5 (+ 5) % Row 1 \SetRowColor{white} Importing decorators & `from numba import jit, njit` \tn % Row Count 7 (+ 2) % Row 2 \SetRowColor{LightBackground} Using jit & `@jit \{\{nl\}\} def function(...): \{\{nl\}\} ~~ ...` \tn % Row Count 10 (+ 3) % Row 3 \SetRowColor{white} Using njit & `@njit \{\{nl\}\} def function(...): \{\{nl\}\} ~~ ...` \tn % Row Count 13 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{This module is very limited, in the sense that only basic and/or numpy operations and classes can speed up. Neither scipy nor pandas or networkx can be improved. If `jit` is used, then those functions are treated as usual. If `njit` is used, then the code will fail to compile as it won't know what to do with them.} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{p{0.8 cm} p{0.8 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Caching}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{} \tn % Row Count 0 (+ 0) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}